当前位置: 首页 > 知识库问答 >
问题:

使用Mockito Spy

弘康安
2023-03-14

我尝试为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扫描报告显示,该方法没有涵盖任何一行。

我是新来的。有人能告诉我我做错了什么吗?谢谢!

谢谢大家的投入。我用@InjectMocks替换了@Spy,但它根本不会增加代码覆盖率。我需要模拟MyRepository,这样我就不必设置数据源/连接。任何人都可以展示可以覆盖大多数测试代码行的示例测试代码吗?

共有1个答案

胥宏义
2023-03-14

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

  • 您无缘无故地使用Spy。您没有使用任何Spy功能,因此您不应该打扰。只需使用一个真正的MyService对象并对其进行测试。
  • 您根本没有注入您的mockMyRepository。这意味着mock永远不会收到您的类对myRepo引用的调用。您可以通过几种不同的方法来解决这个问题,但最简单的方法可能是在您的测试中的MyService声明上添加@InjectMocks注释。
  • 您的测试有一个try/catch块,您可以在其中丢弃任何异常。这意味着如果测试中出现问题,您将永远不会发现。删除try/catch并让JUnit报告任何异常,以便您实际看到它们。
 类似资料:
  • 有没有办法在使用 jongo 查询 MongoDB 时添加 ?我发现这样的错误 - '排序超出了 104857600 字节的内存限制,但没有选择加入外部排序。正在中止操作。传递 allowDiskUse:true 可以选择加入,可以通过以下方式阻止,您的聚合看起来像 但据我所知,Jongo 中的类仅将管道应用于自身,然后您可以使用 方法执行。 是否有任何方法可以将该参数传递给mongo而不从Jon

  • 问题内容: 我在远程服务器上有一个管理Web应用程序。该应用程序是使用MEAN堆栈编写的,我列出了连接到Web应用程序所需的所有RESTful路由。 我正在编写一个Java客户端应用程序,该应用程序需要从该管理应用程序发送和接收数据。如果我具有服务器的IP地址和REST路由,如何将客户端连接到Web应用程序? 我想我需要提供到服务器和REST API文件的URL连接,然后仅调用诸如和的路由功能。

  • 问题内容: 我使用spring数据和方法来获取模型。调用此方法时如何使用查询提示? 上面的源代码工作正常,但是我不能为我的JPA提供程序(在我的情况下为EclipseLink)设置QueryHint。 以上是我使用spring-data使用查询提示的方式, 我还发现了这个尚未解决的问题。 问题答案: 当我想使用spring-data创建查询时,请遵循上述算法。 1)是否已经提供的查询 通过弹簧数据

  • 我使用spring数据和方法获取模型。调用此方法时如何使用查询提示 上面的源代码运行良好,但我无法为我的JPA提供者(在我的例子中是EclipseLink)设置QueryHint。 我使用spring数据使用查询提示的方式如下:, 我也发现这个还没有解决。

  • 通过io的requestAbs方法调用/调用/使用REST API的vertx实现。vertx。果心http。vertx-core-3.2.0中的HttpClient类。jar导致HTTP错误::302,响应数据为HTML Erro响应。 不确定requestAbs方法的行为,因为没有引发异常,也没有写入任何日志。此外,还随附了使用vertx JAR的此方法的源代码。如果方法实现有bug,是否有问

  • 问题内容: 说我有: 我该如何使用表单外部的“提交”按钮提交该表单,我认为在HTML5中有一个“提交”的动作属性,但是我不确定那是否是完全跨浏览器的,如果不是这样的话,做这个? 问题答案: 一个对我来说很好的解决方案,在这里仍然缺少。它需要具有目视隐藏或元件whithin的,和相关的它元件外部。它看起来像这样: 现在,此链接使您可以通过单击元素来“单击”表单元素。

  • 在Hamcrest中有没有一种方法可以比较一个数字范围内的一个数字?我在找这样的东西:

  • 首先创建一个静态页面 index.html 和一个 JS 入口文件 entry.js: <!-- index.html --> <html> <head> <meta charset="utf-8"> </head> <body> <script src="bundle.js"></script> </body> </html> // entry.js document.write('It