【问题标题】:Code coverage for service class method服务类方法的代码覆盖率
【发布时间】:2019-01-19 18:33:51
【问题描述】:

我正在尝试使用 mockito 为服务类方法进行代码覆盖。我是 mockito 的新手,并试图模拟对服务方法的调用,但代码覆盖率为 0。我不确定我是否可以模拟调用或者我是否可以使用这个特定的方法。如果您有任何建议,请让我知道。 代码:

public List<Something> getTrackerData(String startDay,List<Something> someList,  boolean check,String name)
{
//filled with many if else checks
}

这是我想要覆盖的方法。

@InjectMocks 私有TrackerService trackerService;

@Before
public void setup(){
    MockitoAnnotations.initMocks(this);
}

@Test
    public void test01()
    {
        Something ttd =new Something();
        ttd.setCoverageSubType("None");
        ttd.setCoveredAmount("1.0");
        List<Something> list = new ArrayList<>();
        list.add(ttd);

        List<Something > newlist = mock(List.class);
//      when(trackerService.getTrackerData("", newlist, false, "")).
//      thenReturn(list);

        resultList = trackerService.getTrackerData(anyString(), anyList(), anyBoolean(), anyString());

    }

这是我写的测试。我意识到 when 和 Mockito.verify() 仅适用于模拟依赖项。但在这里我没有任何依赖来模拟。所以,问题是我可以用 Mockito 存根参数模拟对trackerService.getTrackerData() 的调用,还是我必须只用实际参数测试方法?

【问题讨论】:

  • 为了让它工作,您需要将调用中的实际参数交换到Mockito.when 与存根参数。然后使用一些测试参数调用实际的服务(在你的 sn-p 最后一行)
  • 所以这将是唯一的方法吗?
  • 这是正确的方法。我想说的是,您目前正在做的是对 mockito 的错误使用
  • 是的,我知道,但问题是我想看看是否可以在不传递确切参数的情况下调用该方法,因为这会消耗大量时间。
  • 明确地说,您正在尝试对您尝试模拟的方法进行代码覆盖?

标签: java unit-testing junit mockito code-coverage


【解决方案1】:

TrackerService 已经在使用 InjectMocks。所以你可以简单地使用 Mockito.when()。

List<Something> result = new ArrayList();
//populate list
Mockito.when(trackerService.getTrackerData(anyString(), anyList(), anyBoolean(), anyString())).thenReturn(result);

【讨论】:

  • 但是我不必@Mock "trackerService" 因为 when 只接受模拟的依赖项,如果我这样做,就不会真正调用 getTrackerData() 方法。
  • 尝试使用@spy注解代替injectMocks
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
相关资源
最近更新 更多