我不想再使用powermock了。因为junit5开始模拟静态类。因此,我试图摆脱powermock方法。
如您所知,您可以使用whenNew关键字创建类的实例。
Junit5中是否有其他选择?
以下是我的代码的一部分:
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));
根据留档,从Mockito 3.5.0开始就可以使用模拟对象构造。
首先,您需要将mockito-inline而不是mockito-core
添加到您的测试依赖项中。mockito-inline
提供了模拟静态或最终方法、构造函数的能力。mockito-core与mockito-inline之间的区别
<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));
}
}
问题内容: 我有一个viewcomponent,其中包含一些嵌入在各个页面中的可重用业务逻辑。这一直很好。但是,我现在需要使用ajax刷新viewcomponent。 有什么办法可以做到这一点?从我所读的内容来看,这是不可能的,尽管该信息有些过时了。如果不可能的话,最好的选择是什么? 问题答案: 在beta7上,现在可以直接从控制器返回ViewComponent。查看公告的“ MVC /剃刀”部分
我正在阅读下面Joe Albahari优秀的“C9简而言之”的摘录,并试图理解这里用粗体描述的内容。有人能用我更能理解的方式解释替代方法吗?出于某种原因,这对我来说似乎有些落后。
问题内容: 出于各种原因,在编写 Java应用程序时 ,调用会被皱眉,所以如何通知调用过程并非一切都按计划进行? 编辑: 1是任何非零退出代码的。 问题答案: 当“应用程序”实际上是较大的Java应用程序(服务器)的子应用程序(例如servlet,applet)时,对的使用会被拒绝:在这种情况下,它可能会停止JVM并因此停止所有其他子应用程序。在这种情况下,抛出适当的异常(最好由应用程序框架/服务
问题内容: 我知道这个话题已经解决了上千次。但是我找不到解决办法。 我正在尝试计算列表(df2.list2)的列中出现列表(df1.list1的每一行)的频率。所有列表仅包含唯一值。List1包含约300.000行,list2包含30.000行。 我有一个有效的代码,但是它的运行速度非常慢(因为我使用的是迭代程序)。我也尝试过itertuples(),但它给了我一个错误(“要解压缩的值太多(预期2
允许我填充包含复选框和单选按钮的HTML表单的替代方法。 我已经设法使用eclipse中的HtmlUnit库将数据发送到html表单并检索页面(我已经发布了下面的Java代码)。 然而,当我将这些代码复制到我的Android项目中时,我发现Android不支持HtmlUnit库。 对于Android来说,HtmlUnit还有其他替代方案吗?另一种方法应该能够将文本、复选框、单选按钮填写到Html表
问题内容: 以前,我总是以为Vector在长度未知的情况下可以很好地用于非描述对象。据我所知,我也认为它也是线程安全的 有什么改变不应该再使用了,替代方案是什么? 问题答案: 您应该使用而不是。虽然使用了内部同步,但是对于实际的一致性而言,这很少够用,只会在真正不需要时降低执行速度。 另请参阅此stackoverflow问题。