Mockito Unit测试类中的void函数

时间:2017-09-04 06:05:49

标签: unit-testing junit mockito powermock easymock

我对Mockito相当新鲜。我不确定如何测试void函数emitcount()或实际测试类为100%?

@AllArgsConstructor(onConstructor = @__(@Inject))
public class MetricsFactoryProvider {
private MetricsFactory metricsHelper;

public void emitCount(final String metricName, final double metricCount, final long startTime) {
    if (StringUtils.isBlank(metricName)) {
        return;
    }
    try {
        Metrics metrics = metricsHelper.newMetrics();
        metrics.addDate("StartTime", startTime);
        metrics.addCount(metricName, metricCount, Unit.ONE);
        metrics.close();
    } catch (Throwable t) {
        throw some exception();
    }
}

这是我到目前为止的代码

public class MetricsFactoryProviderTest {
@Mock
Metrics metrics;

@Mock
MetricsFactory metricsHelper;

public void testemitCountfromMetricsFactoryProvider() {

    metricsHelper = new MetricsHelper();
    Metrics metrics = metricsHelper.newMetrics();
    metrics.addDate("StartTime", System.currentTimeMillis());
    metrics.addCount("some", 1, Unit.ONE);

    MetricsFactoryProvider metricsFactoryProvider = new MetricsFactoryProvider(metrics.getMetricsFactory());
    metricsFactoryProvider.emitCount("some metric name",1,System.currentTimeMillis());

    Assert.assertNotNull(metricsFactoryProvider);

}

如何测试发射功能?我的思考过程

  1. donothing(when(metricsFactoryProvider.emitfunction(pass args)))
  2. 或者我必须使用ArgumentCaptor()吗?如何验证函数emitfunction是否被调用,metricsFactoryProvider对象是否具有正确的数据?

1 个答案:

答案 0 :(得分:2)

这里:

@Mock
Metrics metrics;

一起
Metrics metrics = new MetricsHelper().newMetrics();

根本没有任何感觉。您的测试类定义了一个模拟的Metrics对象 - 但随后创建了另一个真实的度量对象,然后将这些对象传递给您正在测试的类。

这很简单:当您使用真实对象验证预期行为时 - 然后执行此操作。否则,你使用模拟。

然后你可以做像

这样的事情
MetricsFactoryProvider underTest = new MetricsFactoryProvider(mockedHelper);
underTest.emit(...);
verify(mockedHelper).add(eq("Start Date"), any());

仅举例。从这个意义上说:不要试图通过反复试验来学习嘲弄。这太复杂了。相反:阅读并遵循一个好的教程,如one

但是只是在这里给出一个简短的提示:使用模拟有两个不同的情况。

Whatever mockedFoo = mock(Whatever.class);
when(mockedFoo.bar()).thenReturn("something else");
UnderTest underTest = new UnderTest(mockedFoo);
assertThat(underTest.foo(), is("something else"));

以上使用"模拟规范"以便被测试的班级可以其工作。您需要控制模拟以在测试中执行某些操作。将其与:

进行比较
Whatever mockedFoo = mock(Whatever.class);
UnderTest underTest = new UnderTest(mockedFoo);
assertThat(underTest.foo(), is("something else"));
verify(mockedFoo).bar("expected"parm");

在这种情况下,您希望检查发生某个预期的呼叫。