我有实用方法来处理一些文本.处理方式由enum Mode
决定.在编写单元测试来涵盖此方法时,我必须添加哑enum
元素,以便将switch
陈述的default
部分包含到测试中.默认部分是我对enum
由新元素扩展且此新元素未添加到switch
声明的情况的判断,这意味着该新元素将不可能处理.如果我删除哑元素并try 使用null
,那么我会得到NPE和Java甚至不会输入switch
声明-当您将null
用于switch
声明时,这是正常行为.
The question:有没有方法可以避免在单元测试中添加哑enum
元素,但仍然覆盖switch
陈述的default
部分?
为了清晰起见,添加了:Java 17、JUnit Jupiter 5、日食代码覆盖工具
Code
abstract class LineBreaker {
public enum Mode {
LAST_SPACES,
LAST_CHARS,
DUMMY
}
public static String process(
final String text,
final LineBreaker.Mode mode,
final int amount
) {
switch (mode) {
case LAST_SPACES : {
// blah blah create `processingResult`
return processingResult;
}
case LAST_CHARS : {
// blah blah create `processingResult`
return processingResult;
}
default :
throw new IllegalStateException(
"Processor for " +
LineBreaker.class.getSimpleName() + "." +
LineBreaker.Mode.class.getSimpleName() + "." +
mode.name() +
" not implemented"
);
}
}
}
Unit test
@Test
void testLineBreakerException() {
assertThrows(
IllegalStateException.class,
() -> LineBreaker.process( "Dog", LineBreaker.Mode.DUMMY, 10 ),
"Expected " + IllegalStateException.class.getSimpleName()
);
}
Unit test without additional dummy enum element
Code coverage without additional dummy enum element
Unit test with additional dummy enum element
Code coverage without additional dummy enum element