我尝试为Spring Boot应用程序的以下服务类编写一个Junit测试用例。
@Service
@Transactional
public class MyService {
private static final Logger log = LoggerFactory.getLogger(ataService.class);
@Autowire
private MyRepository myRepo;
public Map<String, Object> myMethod(Response rsp, Request req) {
Map<String, Object> data = new HashMap<String, Object>();
data.put("PROCESS_I", req.getProcessI());
data.put("REQUEST_I", req.getRequestI());
data.put("TYPE_COE", req.getTypeCoe());
data.put("STATUS_COE", rsp.getStatusCoe());
Map<String, Object> result = null;
try {
result = myRepo.update(ata);
} catch (Exception e) {
log.error("Error occurre uring upate : " + e.getMessage());
}
return result;
}
}
我试图用这个测试用例覆盖尽可能多的行
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {
@Mock
private MyRepository myRepository;
@Spy
private MyService myService;
@Test
public voi test() {
Request req = new Request();
req.setProcessI(new Bigecimal("43850"));
req.setRequestI(new Bigecimal("146717"));
req.setTypeCoe("ABC");
Response rsp = new Response();
vetResp.setStatusCoe("N");
Map<String, Object> data = new HashMap<String, Object>();
data.put("PROCESS_I", req.getProcessI());
data.put("REQUEST_I", req.getRequestI());
data.put("TYPE_COE", req.getTypeCoe());
data.put("STATUS_COE", rsp.getStatusCoe());
Map<String, Object> result = null;
try {
doReturn(result).when(myRepository.update(data));
result = myService.myMethod(vetResp, req);
verify(myRepository, atLeast(1)).update(any(Map.class));
} catch(Exception e) {
}
}
}
我认为语句“myService.myMethod(vetResp,req);“将运行真正的方法,因为myService是用@Spy注解的。但是SonarQube扫描报告显示没有覆盖任何一行方法。
我是Mockito的新手。有人能告诉我我做错了什么吗?谢谢!
感谢大家的意见。我用@InjectMocks替换了@Spy,但是它根本没有增加代码覆盖率。我需要模拟MyRepository,这样我就不必设置数据源/连接。有人能展示一下可以覆盖大多数测试代码行的示例测试代码吗?
1条答案
按热度按时间mftmpeh81#
这个测试有三个主要问题。
Spy
,没有任何理由。您没有使用任何Spy
特性,所以您不应该费心。只需使用一个真正的MyService
对象并对其进行测试即可。MyRepository
。这意味着mock永远不会接收你的类对myRepo
引用的调用。有几种不同的方法可以解决这个问题,但最简单的一种可能是在你的测试中的MyService
声明上放置一个@InjectMocks
注解。try/catch
块,在这里你可以丢弃所有的异常。这意味着如果你的测试出了问题,你永远不会发现它。删除try/catch
,让JUnit
报告所有的异常,这样你就可以看到它们了。