单体测试中,需要模拟测试对象方法内创建的新对象的动作
try (var mocked = mockConstruction(Sample.class, (mock, context)-> {
// 在测试方法内每次创建Sample对象时,会得到模拟对象mock,对mock进行打桩
when(mock.method1(any())).thenReturn("abcd");
})) {
// 执行测试方法
}
单体测试中,需要模拟测试对象方法内调用的另一个类的静态方法
// 对有参数的静态方法进行打桩
try (var mocked = mockStatic(Sample.class)) {
mocked.when(() -> Sample.method1(any(String.class)))
.thenAnswer(invocation -> {
var arg1 = (String) invocation.getArgument(0);
// 做一些操作
// 当静态方法返回值类型为void时,固定返回null,否则返回对应类型的值就行
return null;
});
// 执行测试方法
// 验证静态方法被执行一次
mocked.verify(()->Sample.method1("abcd"), times(1));
}
// 对无参数的静态方法进行打桩,官方示例
try (var mocked = mockStatic(Foo.class)) {
mocked.when(Foo::method).thenReturn("bar");
assertEquals("bar", Foo.method());
mocked.verify(Foo::method);
}
注意:两种打桩方式,都需要放在try() {}块里,或者在@BeforeEach方法中创建,在@AfterEach方法中调用close()方法手动关闭。否则会影响相同测试线程中的后续测试。