【问题标题】:Mockito Unit Test void function in a class类中的 Mockito 单元测试 void 函数
【发布时间】:2018-02-12 08:14:43
【问题描述】:

我对 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);

}

如何测试 emitfunction?我的思考过程

  1. 什么都不做(when(metricsFactoryProvider.emitfunction(pass args)))
  2. 或者我必须使用 ArgumentCaptor() 吗?如何验证函数 emitfunction 是否被调用且 metricsFactoryProvider 对象的数据是否正确?

【问题讨论】:

  • 提示:preview 窗口的存在是有原因的。确保在发布之前检查您输入的格式。您希望我们花时间为您提供帮助 - 所以请您花 1 分钟时间来正确格式化/缩进您的输入!
  • 对不起,我纠正了它
  • 没有问题。请记住,对于未来......以及除此之外:不要忘记在某些时候接受答案 - 向未来的读者展示问题已解决。至少考虑在某个时候提出有用的答案......现在你已经达到了那个水平;-)

标签: unit-testing junit mockito powermock easymock


【解决方案1】:

这里是:

@Mock
Metrics metrics;

一起

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

根本没有任何意义。您的测试类定义了一个模拟的 Metrics 对象 - 然后创建 另一个 真正的指标对象,然后将其传递给您的测试类。

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

然后你可以做类似的事情

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");

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

【讨论】:

  • 如果您有新问题,请考虑提出一个真实、完整的问题。不要对某些答案发表评论,以提出与您评论的问题/答案无关的问题。
猜你喜欢
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多