使用Mockito间谍

sdnqo3pr  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(149)

我尝试为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,这样我就不必设置数据源/连接。有人能展示一下可以覆盖大多数测试代码行的示例测试代码吗?

mftmpeh8

mftmpeh81#

这个测试有三个主要问题。

  • 您使用的是Spy,没有任何理由。您没有使用任何Spy特性,所以您不应该费心。只需使用一个真正的MyService对象并对其进行测试即可。
  • 你根本没有注入你的mock MyRepository。这意味着mock永远不会接收你的类对myRepo引用的调用。有几种不同的方法可以解决这个问题,但最简单的一种可能是在你的测试中的MyService声明上放置一个@InjectMocks注解。
  • 你的测试有一个try/catch块,在这里你可以丢弃所有的异常。这意味着如果你的测试出了问题,你永远不会发现它。删除try/catch,让JUnit报告所有的异常,这样你就可以看到它们了。

相关问题