我不想再用强力模拟了。因为junit5开始模拟静态类。因此,我试图摆脱powermock方法。
如您所知,您可以使用whenNew关键字创建类的实例。
在Junit5 for whenNew中有其他选择吗?
下面是我代码的一部分:
whenNew(PDFDocument.class).withNoArguments().thenReturn(pdfDocument);
whenNew(PSConverter.class).withNoArguments().thenReturn(converter);
doNothing().when(pdfDocument).load(ArgumentMatchers.any(ByteArrayInputStream.class));
doAnswer(invocationOnMock -> {
ByteArrayOutputStream outputStream = invocationOnMock.getArgument(1);
outputStream.write(content);
return outputStream;
}).when(converter).convert(ArgumentMatchers.any(), ArgumentMatchers.any(ByteArrayOutputStream.class));发布于 2022-05-22 13:55:06
根据文档的说法,从Mockito3.5.0开始就可以使用模拟对象构造。
首先,需要将mockito内嵌而不是mockito-core添加到测试依赖项中。
mockito-inline提供了模拟静态或最终方法、构造函数的能力。mockito核与mockito内联的区别
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>让我们为测试实例化对象创建一个简单的服务。
public class A {
private final String test;
public A(String test) {
this.test = test;
}
public String check() {
return "checked " + this.test;
}
}
public class B {
private String check = " B check ";
public String check() {
return check;
}
}
public class TestService {
public String purchaseProduct(String param) {
A a = new A(param);
B b = new B();
return a.check() + b.check();
}
}带有注释的构造函数模拟示例:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.MockedConstruction;
import org.mockito.Mockito;
import static org.mockito.Mockito.when;
public class ConstructorMockTest {
@Test
public void test_mocked_construction() {
try (
//create mock for object A
MockedConstruction<A> mockedA = Mockito.mockConstruction(A.class,
(mock, context) -> {
//set return value for object A mock methods
when(mock.check()).thenReturn(" Constructor Mock A ");
});
//create mock for object B
MockedConstruction<B> mockedB = Mockito.mockConstruction(B.class,
(mock, context) -> {
//set return value for object B mock methods
when(mock.check()).thenReturn(" Constructor Mock B ");
}))
{
// every A object creation is current try() scope returning a mock
A aObject = new A("test");
Assertions.assertEquals( aObject.check(), " Constructor Mock A ");
// every B object creation is current try() scope returning a mock
B bObject = new B();
Assertions.assertEquals( bObject.check(), " Constructor Mock B ");
//Example of testing service which creates A and B objects
TestService service = new TestService();
String serviceResult = service.purchaseProduct("test");
Assertions.assertEquals(serviceResult, " Constructor Mock A Constructor Mock B ");
}
}
}在您的课程中,例如:
@Test
public void test() {
byte[] content = new byte[] {1,1};
try (
MockedConstruction<PDFDocument> mockedPDFDocument = Mockito.mockConstruction(PDFDocument.class,
(mock, context) -> {
doNothing().when(mock).load(ArgumentMatchers.any(ByteArrayInputStream.class));
});
MockedConstruction<PSConverter> mockedPSConverter = Mockito.mockConstruction(PSConverter.class,
(mock, context) -> {
doAnswer(invocationOnMock -> {
ByteArrayOutputStream outputStream = invocationOnMock.getArgument(1);
outputStream.write(content);
return outputStream;
}).when(mock).convert(ArgumentMatchers.any(), ArgumentMatchers.any(ByteArrayOutputStream.class));
}))
{
//call services which instantiates PDFDocument and PSConverter
PDFDocument pdfDocument = new PDFDocument();
PSConverter psConverter = new PSConverter();
Assertions.assertTrue(org.mockito.internal.util.MockUtil.isMock(pdfDocument));
Assertions.assertTrue(org.mockito.internal.util.MockUtil.isMock(psConverter));
}
}https://stackoverflow.com/questions/72337164
复制相似问题