다음 테스트를 실행하면 원래 객체가 반환되고 모의 객체가 반환되지 않으므로 실제 메소드 getLevelCriteriaForLevel (level)이 실행 중입니다 (디버거에서 관찰 됨). 왜 이렇게이다? 나는 이것이 이미 어제 일했고 나는 그곳에서 아무 것도 바꾸지 않았을 것이라고 확신한다. Mockito/PowerMock .... 그런 다음 호출되지 않습니다?
는 이미@PrepareForTest({LevelCriteria.class, LevelGenerator.class})
을 시도하거나 내가 전에 그랬던 것처럼 MockitoJunitRunner을 사용하지만,이 역시 도움이되지 않습니다. 다음은 코드입니다 (generateConcreteLevel은 private 메소드입니다. 예상 된 예외는 모의에서이 데이터를 전달할 때만 throw됩니다. 그렇지 않으면 예외가 throw되지 않기 때문에 테스트가 실패합니다. 모의 객체하지만 실제 개체) : 그런데
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);
}
}
: 메이븐 빌드 같은 오류가 발생하기 때문에 그것은, 이클립스 문제가 아니에요. 리팩토링 한 후에 PowerMockito의 Whitebox로 직접 private 메소드를 실행할 수 있다는 것을 알고 있습니다.하지만 질문은 왜, 언제 ... 여기에서 작동하지 않는지입니다.
이것은 실제 질문에 대한 답변이 아니라 실제 삶의 문제에 대한 해결책입니다. ;-) 어쨌든 내 대답이 당신을 도왔 으면 좋겠다. – Jmini