【发布时间】:2020-03-02 08:06:04
【问题描述】:
我有一个类似于下面的类结构
public abstract class AbstractStep {
private final Range RANGE;
AbstractStep(AbstractStepBuilder builder) {
RANGE = builder.range;
}
public abstract static class AbstractStepBuilder {
Range range;
public AbstractStepBuilder setRange(int start, end end) {
this.range = new Range(start, end);
return self();
}
abstract AbstractStepBuilder self();
}
public static class Range() {
private final int START;
private final int END;
private Range(int start, int end) {
if(start < 0 || end < 0 || start >= end)
throw new IllegalArgumentException();
START = start;
END = end;
}
}
}
我想在AbstractStepBuilder 中测试setRange(int, int),看看是否抛出了IllegalArgumentException。我使用 TestNG 和 Mockito,并在 this 的帮助下尝试了以下使用。
final class RangeTest {
AbstractStepBuilder builder;
@BeforeSuite
void setup() {
builder = Mockito.mock(AbstractStepBuilder.class);
Mockito.when(builder.self()).thenReturn(null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
final void testCreatingRangeWithNegativeStart() {
builder.setRange(-1, 2);
}
}
此测试失败。我还尝试将Mockito.mock(AbstractStepBuilder.class) 替换为Mockito.mock(AbstractStepBuilder.class, Mockito.CALLS_REAL_METHODS),如this 问题的最佳答案。
请注意,如果我将 CodeRange 作为自己的外部类,则此测试通过,所以我不相信它可能是测试本身。
为什么这个测试会失败,是否可以在不使用测试中的具体类的情况下修复它?
【问题讨论】:
-
你根本不调用 AbstractStepBuilder#setRange
-
你得到什么错误?
-
@kofemann 已修复,由于从更复杂的项目中复制,因此抱歉
-
@ThomasMartin
RangeTest中的测试失败 -
“我们可以在不使用测试中的具体类的情况下修复它吗?”具体来说不是,因为您不能在具体类上调用实例方法。它必须是具体的。在测试范围内创建一个最小的子类看起来是正确的方法。
标签: java mockito testng abstract-class