我正在使用 Mockito 来测试我的 Java 应用程序中的方法。
如何测试构造函数是否被调用一次?
我正在尝试进行类似于此的验证:
verify(myClass, times(1)).doSomething(anotherObject);
但是我无法验证是否调用了构造函数,因为它没有类似于 doSomething()
的方法。
原文由 java123999 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在使用 Mockito 来测试我的 Java 应用程序中的方法。
如何测试构造函数是否被调用一次?
我正在尝试进行类似于此的验证:
verify(myClass, times(1)).doSomething(anotherObject);
但是我无法验证是否调用了构造函数,因为它没有类似于 doSomething()
的方法。
原文由 java123999 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用 Mockito 和 PowerMockito 来完成。
假设您有一个带有构造函数的 ClassUnderTest
public class ClassUnderTest {
String name;
boolean condition;
public ClassUnderTest(String name, boolean condition) {
this.name = name;
this.condition = condition;
init();
}
...
}
另一个调用该构造函数的类
public class MyClass {
public MyClass() { }
public void createCUTInstance() {
// ...
ClassUnderTest cut = new ClassUnderTest("abc", true);
// ...
}
...
}
在测试课上我们可以…
(1) 使用 PowerMockRunner 并在 PrepareForTest 注释中引用上面的两个目标类:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ ClassUnderTest.class, MyClass.class })
public class TestClass {
(2)拦截构造函数返回一个mock对象:
@Before
public void setup() {
ClassUnderTest cutMock = Mockito.mock(ClassUnderTest.class);
PowerMockito.whenNew(ClassUnderTest.class)
.withArguments(Matchers.anyString(), Matchers.anyBoolean())
.thenReturn(cutMock);
}
(3) 验证构造函数调用:
@Test
public void testMethod() {
// prepare
MyClasss myClass = new MyClass();
// execute
myClass.createCUTInstance();
// checks if the constructor has been called once and with the expected argument values:
String name = "abc";
String condition = true;
PowerMockito.verifyNew(ClassUnderTest.class).withArguments(name, condition);
}
原文由 Jose Tepedino 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
这不能用 Mockito 完成,因为正在创建的对象不是模拟对象。这也意味着您将无法验证该新对象上的任何内容。
过去,我通过使用
Factory
创建对象而不是更新对象来解决这种情况。然后,您可以模拟Factory
以返回测试所需的对象。您是否愿意更改设计以适合您的测试取决于您!