【发布时间】:2014-07-09 18:46:04
【问题描述】:
当我执行以下测试时,返回的是原始对象而不是模拟对象,因此正在执行真正的方法 getLevelCriteriaForLevel(level)(我在调试器中观察到了这一点)。为什么呢?我很确定这昨天已经奏效了,我没有改变任何东西。
我已经试过了
@PrepareForTest({LevelCriteria.class, LevelGenerator.class})
或像我以前那样使用 MockitoJunitRunner,但这也无济于事。 这是代码(generateConcreteLevel是一个私有方法。只有当我从mock传递这个数据时才会抛出预期的异常。否则不会抛出。测试失败是因为没有抛出异常,因为测试没有使用mock对象但真实对象):
public class LevelGenerator
{
public void createLevel(int level)
{
generateConcreteLevel(levelCriteria.getLevelCriteriaForLevel(level));
}
private void generateConcreteLevel(LevelCriterion levelCriterion)
{
int entryGroupCount = levelCriterion.getEntryGroupCount();
int exitGroupCount = levelCriterion.getExitGroupCount();
int exitsWhileEntries = levelCriterion.getExitsWhileEntries();
int maxGroupSize = levelCriterion.getMaxGroupSize();
List<Question> questions = levelCriterion.getQuestions();
int speed = levelCriterion.getSpeed();
Range blueItemsCount = levelCriterion.getBlueItemsCount();
Range brownItemsCount = levelCriterion.getBrownItemsCount();
Range greenItemsCount = levelCriterion.getGreenItemsCount();
Range redItemsCount = levelCriterion.getRedItemsCount();
Range whiteItemsCount = levelCriterion.getWhiteItemsCount();
Range timespanBetweenGroups = levelCriterion.getTimespanBetweenGroups();
float fractionOfCarAmountToLeave = levelCriterion.getFractionOfCarAmountToLeave();
float fractionOfMinimumItemsAmountInCarParkToStartExits = levelCriterion.getFractionOfMinimumItemsAmountInCarParkToStartExits();
checkItemsFitInEntryGroups(entryGroupCount, maxGroupSize, blueItemsCount, brownItemsCount, greenItemsCount, redItemsCount, whiteItemsCount);
}
private void checkItemsFitInEntryGroups(int entryGroupCount, int maxGroupSize, Range... ranges)
{
int totalRangeCount = 0;
for (Range range : ranges)
{
totalRangeCount += range.getMaximum();
}
if (totalRangeCount > entryGroupCount * maxGroupSize)
{
throw new UnsupportedOperationException("Error in level criterion: Not enough entry groups for Items.");
}
}
}
还有测试...
@RunWith(PowerMockRunner.class)
public class LevelGeneratorTest
{
@Mock
private LevelCriteria levelCriteriaMock;
@InjectMocks
private LevelGenerator levelGenerator;
@Test(expected=UnsupportedOperationException.class)
public void tooLessPositionsInEntryGroups()
{
LevelCriterion levelCriterion = new LevelCriterion.LevelCriterionBuilder()
.withBlueItemsCount(new Range(10, 10))
.withEntryGroupCount(3)
.withExitGroupCount(3)
.withMaxGroupSize(3)
.build();
when(levelCriteriaMock.getLevelCriteriaForLevel(anyInt())).thenReturn(levelCriterion);
levelGenerator.createLevel(0);
}
}
顺便说一句:这不是 Eclipse 问题,因为 Maven 构建会产生相同的错误。 我知道我可以直接用 PowerMockito 的 Whitebox 执行私有方法,我将在重构之后做什么,但问题是,为什么 when...then 在这里不起作用。
【问题讨论】:
标签: junit mockito junit4 powermock