使用Mockito 4.8.0版
我需要测试的控制器方法
@GetMapping(value = "getStringBuiltByComplexProcess")
public String getStringBuiltByComplexProcess(@RequestParam String firstName, @RequestParam String lastName ) {
Author a = new Author();
return a.methodWhichMakesNetworkAndDatabaseCalls(firstName, lastName);
}
以下是测试方法
@Test
public void testGetStringBuiltByComplexProcess01() {
final String firstName = "firstName";
final String lastName = "lastName";
try (MockedConstruction<Author> mock = mockConstruction(Author.class)) {
Author authorMock = new Author();
when(authorMock.methodWhichMakesNetworkAndDatabaseCalls(eq(firstName), eq(lastName))).thenReturn("when worked");
assertEquals("when worked", ut.getStringBuiltByComplexProcess(firstName, lastName), "Strings should match");
verify(authorMock).methodWhichMakesNetworkAndDatabaseCalls(eq(firstName), eq(lastName));
}
}
失败,并显示以下消息
org.opentest4j.AssertionFailedError: strings should match ==> expected: <when worked> but was: <null>
在这个简化的例子中,控制器方法有更多的代码,但是不起作用的核心是模拟控制器方法构造的对象。
2条答案
按热度按时间ncgqoxb01#
您在线上创建的对象
与在
getBooksByAuthor()
函数中创建的不同。调试器应该会向您显示这一点。您可以使用
mock.constructed().get(0)
来获取在getBooksByAuthor()
中创建的对象,但是当您可以这样做时,getBooksByAuthor()
已经完成了,您不能用该mock做太多事情。我不清楚你的目标是什么,我猜你想检查
Author
对象是以某种方式创建的,而涉及getFullName()
的行不是实际代码的一部分,只是你为了实验而添加的东西,因为它们什么也不做。如果你想验证传递给
dataAccessService
的对象是否满足某些条件,你需要的是一个ArgumentCaptor
。m4pnthwp2#
如果您使用
MockInitializer
进行存根,它应该可以解决您的问题:但是一个更好的测试控制器的方法是使用
MockMvc
。它允许你测试一个给定的HTTP请求,你是否正确地配置了spring-mvc,使它可以正确地做以下事情:所有这些东西都不能用你的脆弱的模拟构造函数方法来测试。
有关
MockMvc
的详细信息,请参阅this guide。