gpt4 book ai didi

java - 具有嵌套依赖项的测试类

转载 作者:行者123 更新时间:2023-12-02 12:23:40 24 4
gpt4 key购买 nike

我正在测试一个具有嵌套( Autowiring )依赖项的类。该类实现用于在后端进行更改的业务逻辑。具体来说,测试应该断言当某个后端调用返回错误时:

  • 不再进行后端调用
  • 响应对象返回错误

我不知道后者是怎么做的。我的类(class)看起来像这样:

public class Handler {

@Autowired
private DaoImpl dao;

@Autowired
private SpecificUtil util1;

@Autowired
private GeneralUtil util2;

@Autowired
private Helper helper;

public Response doSomethingClever(Request request) {
// calls to dao
// logic with help of util and helper classes
}
}

测试类:

public class HandlerTest {

@Spy
private DaoImpl dao;

@Mock
private SpecificUtil util1;

@Mock
private GeneralUtil util2;

@Mock
private Helper helper;

@InjectMocks
Handler handler;

@Test
public void testDoSomethingClever() {
// set up dao to fail
QueryResult error = getErrorResult();
org.mockito.Mockito.when(dao.queryBackEnd(any(SpecificQuery.class))).thenReturn(error);

// perform query
Request request = getTestRequest();
Response errorResponse = handler.doSomethingClever(request);

// verify that either:
// Response has errors - fails
// because helper classes are mocks, have not set the error
assertNotNull(response.getErrorMessage());

// the method setErrors of Response was called once - fails
//because the setError was called earlier!
Response spyResponse = Mockito.spy(errorResponse);
verify(spyResponse, times(1)).setError(anyString);

//verify no other calls are made except the queryBackEnd call - this part works
org.mockito.Mockito.verify(dao).queryBackEnd(any(SpecificQuery.class));
org.mockito.Mockito.verifyNoMoreInteractions(dao);
}

}

Response 对象是在 Handler 类中创建的。如果我检查返回的响应,Mockito 不会记录任何交互,因为交互是在调用 Mockito.spy 之前发生的。

我尝试使用 @Spy 而不是 @Mock 使其成为集成测试。这个想法是实例化除 dao 之外的所有嵌套依赖项,并获得正确的响应来测试错误。但这不起作用,因为一些 @Autowired 帮助程序和实用程序类也具有 @Autowired 依赖项,并且这些嵌套依赖项在测试期间不会实例化。

有没有办法用 Mockito 将 @Spy 对象注入(inject)到其他 @Spy 对象中?或者在这种情况下还有其他解决方案吗?我可以编写自己的模拟对象吗?

最佳答案

单元测试应仅测试特定单元的代码(此处为 Handler 类)。这包括与依赖项交互。

根据您在问题和评论中所写的内容,您的handle方法看起来像这样:

public class Handler {

@Autowired
private DaoImpl dao;

@Autowired
private Util util;

public Response doSomethingClever(Request request) {
SpecificQuery specificQuery = new SpecificQuery();
specificQuery.setSomeData(request.getSomeData());

IntermidiateResponse intermidiateResponse = dao.queryBackEnd(specificQuery);
Response response = util.processIntermidiateResult(intermidiateResult);

return response;
}
}

这里有一些单元测试的交互:

  • 给定 Request实例断言DaoImpl::queryBackEnd使用 SpecificQuery 调用方法具有 someData 的实例属性设置为someData属性来自Request对象
  • 受到 mock IntermidiateResponseDaoImpl::queryBackEnd 返回方法断言此结果被传递到 Util::processIntermidiateResult方法
  • 受到 mock ResponseUtil::processIntermidiateResult 返回方法断言这正是从 handle 返回的内容方法

这样您就可以 100% 覆盖 Handler::handle方法。如果响应处理管道中有更多调用,您可以相应地测试它们。

希望这能回答您的问题。祝你好运

关于java - 具有嵌套依赖项的测试类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45593135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com