我正在为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);
}
}
有人可以帮我解决这个问题吗?
答案 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);
再次,荒谬。您的单元测试的整个想法是,当出现问题时它们会失败。当生产代码引发意外异常时,您无需记录它们,而只是让它们最终使您的测试用例失败。
要回答一个实际的问题:它看起来像您的生产代码正在使用特定的“恒定”记录器实例。在这种设计下,检查生产代码的唯一方法是:
underTest
underTest
上进行测试(并以某种方式强制该方法引发异常)error()
的预期调用我们不能提供更好的建议,因为您的代码输入不足,我们真的不知道您的生产类在做什么(例如:我们不知道LOGGER是什么,以及它的去向如果它恰好是一个静态变量,那么很可能无法通过Mockito对其进行“控制”。
无论如何,您实际上可能需要间谍概念。为了测试addTextToQueue()
,您需要一种方法来调用“真实的” addTextToQueue()
实现,但是内部对addTser()
的调用需要进行模拟(以便您可以控制打电话)。
但是,正如所说的那样:首先,我们要真正研究Mockito的工作原理,而不是将一些“试错”方法中没有意义的东西放在一起。带有模拟的正确的单元测试非常复杂,您无法通过“反复试验”来学习。