java - 模拟单元测试和工厂
问题描述
假设我有一个需要测试的 C 类。它的部分工作是创建许多其他重要的类对象(每个都有自己的业务逻辑)并在这些新对象上调用各种方法。我希望能够在不测试 C 创建的其他对象的实现的情况下测试 C 类。唯一真正的解决方案是创建一个创建那些非平凡对象的工厂,然后将一个模拟的工厂实例传递给测试?我不想有一个工厂来创建那些其他重要的对象,但另一方面我不想每个非平凡的类都有一个工厂。
还有其他建议吗?
编辑:根据要求添加了一些伪代码
public B doIt()
{
List<A> as = getListOfAsFromDatabase();
AParser AParser = new AParser();
boolean foo = aParser.parse(as); // may modify the list of A's
B b = new B();
return b.add(foo, as);
}
解决方案
如果依赖对象创建是在成员级别,我们可以使用 Mockito 和 PowerMock 来创建模拟和更新成员模拟依赖。我正在使用静态内部类来简化此操作,此解决方案也适用于常规类。
public class Test1 {
@Test
public void test() {
B mockedb = org.mockito.Mockito.mock(B.class);
A a = new A();
org.powermock.reflect.Whitebox.setInternalState(a, "b", mockedb);
a.exe();
}
public static class A {
private B b = new B();
public void exe() {
List<String> l = new ArrayList<>();
l.add("a");
b.exeB(l);
System.out.println(l);
}
public static class B {
public void exeB(List<String> s) {
s.add("b");
}
}
}
}
推荐阅读
- vba - 使用 VBA 移动已在 Windows 资源管理器中打开的文件夹:路径/文件访问错误
- powershell - 如何用 Pester 模拟 $host.ui.PromptForChoice
- python - 如何使用 DBSCAN 设置好的参数对高密度数据进行聚类?
- sql - 将字段添加到 SELECT *
- circuit-sdk - 通过 REST API 从 Circuit Conversation 下载附件
- python - 我怎么知道什么时候在 QTextEdit 上按下了 Enter 键
- android - 如何在 onResponse 中捕获 Retrofit 响应错误?
- python - Django 2.2.4 - 在 makemigrations 之后运行迁移时“没有要应用的迁移”
- python - 字典列表中字典列表的Glom规范
- java - 如何制作 MPAndroidChart RadarChart 圆形