尝试使用slif4j捕获块的模拟测试的问题

时间:2019-01-16 11:38:40

标签: java unit-testing spring-boot testing mockito

我正在为try catch块编写测试,但是我对如何测试catch块感到很困惑...尤其是它使用 slf4j 记录错误。

addText这是同一类的另一个方法。

public class TextQueue {
  public void addTextToQueue(final Text text) {
            try {
                if (text != null) {
                    addText(text);
                }
            } catch (final JsonProcessingException e) {
                LOGGER.error("Error adding text to the queue : {}", e);
            }
        }
}

这是我的测试用例

@RunWith(MockitoJUnitRunner.class)
public class TextQueueTest {
private org.slf4j.Logger LOGGER = LoggerFactory.getLogger(TextQueueTest.class);

private static final String MY_TEXT = "src/text.json";
private Text text;
private final ObjectMapper mapper = new JacksonConfig().dateAsStringObjectMapper();

@Mock
private TextQueue textQueue;

@Before
public void setUp() throws IOException {
    text = mapper.readValue(new File(TextQueueTest.MY_TEXT), Text.class);

}

@Test
public void addTextToQueue() {
    try{
        textQueue = spy(textQueue);
        textQueue.addTextToQueue(text);
    }catch(final Exception e){
        LOOGER.error("add text to queue threw an error" + e);
    }
}

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

首先,您应该真正阅读有关Mockito的不错的教程,例如vogella中的教程。您会发现,您只是把很多荒谬的东西放在一起。

赞:

@Mock
private TextQueue textQueue;

然后拥有

textQueue = spy(textQueue);
在测试用例中。您应该对此非常清楚。间谍建立在被测类的真实实例上。像这样说,创建一个间谍来监视间谍:这没有任何意义。

然后:

}catch(final Exception e){
    Logger.error("add text to queue threw an error" + e);

再次,荒谬。您的单元测试的整个想法是,当出现问题时它们会失败。当生产代码引发意外异常时,您无需记录它们,而只是让它们最终使您的测试用例失败。

要回答一个实际的问题:它看起来像您的生产代码正在使用特定的“恒定”记录器实例。在这种设计下,检查生产代码的唯一方法是:

  • 使LOGGER成为模拟对象
  • 以某种方式将其注入生产代码类的实例underTest
  • 触发该方法在underTest上进行测试(并以某种方式强制该方法引发异常)
  • 验证模拟的LOGGER看到了对error()的预期调用

我们不能提供更好的建议,因为您的代码输入不足,我们真的不知道您的生产类在做什么(例如:我们不知道LOGGER是什么,以及它的去向如果它恰好是一个静态变量,那么很可能无法通过Mockito对其进行“控制”。

无论如何,您实际上可能需要间谍概念。为了测试addTextToQueue(),您需要一种方法来调用“真实的” addTextToQueue()实现,但是内部对addTser()的调用需要进行模拟(以便您可以控制打电话)。

但是,正如所说的那样:首先,我们要真正研究Mockito的工作原理,而不是将一些“试错”方法中没有意义的东西放在一起。带有模拟的正确的单元测试非常复杂,您无法通过“反复试验”来学习。