Java 如何测试&x201C;验证流程”;密码你会测试这一切还是只是个别的跳棋?
我想为我的代码编写单元测试 然而,在编写它时,我似乎只能验证一个方法或另一个方法被调用过一次 我的类是一个执行验证流的管理器 它调用许多checker\verifier-因此它们具有真正的逻辑 您建议我如何测试这种“验证流”代码 我的代码:Java 如何测试&x201C;验证流程”;密码你会测试这一切还是只是个别的跳棋?,java,unit-testing,testing,mocking,mockito,Java,Unit Testing,Testing,Mocking,Mockito,我想为我的代码编写单元测试 然而,在编写它时,我似乎只能验证一个方法或另一个方法被调用过一次 我的类是一个执行验证流的管理器 它调用许多checker\verifier-因此它们具有真正的逻辑 您建议我如何测试这种“验证流”代码 我的代码: public AlternativeShortTotalChecker(SegmentsIdsChecker segmentsIdsChecker, InstructionsChecker instructionsChecker,
public AlternativeShortTotalChecker(SegmentsIdsChecker segmentsIdsChecker, InstructionsChecker instructionsChecker,
RouteNameChecker routeNameChecker, AlternativeDistanceChecker
alternativeDistanceChecker, AlternativeTimeChecker
alternativeTimeChecker,
IDeltaFromBaselineGenerator deltaFromBaselineGenerator,
AStarVisitedChecker aStarVisitedChecker, GlobalSettings globalSettings) {
this.segmentsIdsChecker = segmentsIdsChecker;
this.instructionsChecker = instructionsChecker;
this.routeNameChecker = routeNameChecker;
this.alternativeDistanceChecker = alternativeDistanceChecker;
this.alternativeTimeChecker = alternativeTimeChecker;
this.deltaFromBaselineGenerator = deltaFromBaselineGenerator;
this.aStarVisitedChecker = aStarVisitedChecker;
this.globalSettings = globalSettings;
}
public List<String> checkAllAlternativesShort(CompleteRoutingResponseShort baselineRoutingResponse,
CompleteRoutingResponseShort
routingResponse) {
int numOfAlts = routingResponse.alternatives.size();
List<String> testFailureMessages = new ArrayList<>();
for (int i = 0; i < numOfAlts; i++) {
ResponseShort currentResponse = getAlternativeShort(routingResponse, i).response;
ResponseShort baselineResponse = getAlternativeShort(baselineRoutingResponse, i).response;
AlternativeShort alternativeShort = getAlternativeShort(routingResponse, i);
String testFailureMessage = checkAlternative(alternativeShort.alternative_regression_id, currentResponse,
baselineResponse);
testFailureMessages.add(testFailureMessage);
}
return testFailureMessages;
}
private AlternativeShort getAlternativeShort(CompleteRoutingResponseShort routingResponse, int i) {
return routingResponse.alternatives.get(i);
}
private String checkAlternative(String currentAltId, ResponseShort currentResponse,
ResponseShort baselineResponse) {
IndividualStat individualStat = new IndividualStat(currentAltId);
aStarVisitedChecker.setForAltDiff(globalSettings.astarVisited_altDiffHighThreshold);
individualStat.aStarVisitedDelta = aStarVisitedChecker.checkAStarCountPerAlt(currentResponse, baselineResponse);
individualStat.segmentsIdsDelta = segmentsIdsChecker.checkSegmentsIdsUnorderedIdentity(currentResponse,
baselineResponse);
switch (individualStat.segmentsIdsDelta.delta) {
case IDENTICAL: {
individualStat.areInstructionsIdentical = instructionsChecker.checkTotalInstructionIdentity
(currentResponse, baselineResponse);
individualStat.areRouteNamesIdentical = routeNameChecker.checkRouteNameIdentity(currentResponse,
baselineResponse);
break;
}
case SMALL:
case LARGE: {
individualStat.distancesDelta = alternativeDistanceChecker.checkTotalDistanceIdentity
(currentResponse, baselineResponse);
individualStat.timesDelta = alternativeTimeChecker.checkTotalTimeIdentity(currentResponse,
baselineResponse);
break;
}
}
return deltaFromBaselineGenerator.addDeltaForSpecificAlternative(individualStat);
}
我觉得你现在做的很好。不是所有的类都会产生具体的结果,但是对于编排来说是很重要的,测试这些和验证编排是很好的方法。考虑使用注解(注解和模拟)来简化测试设置,这样你的问题就不够具体了;您要求我们仔细分析您的代码和单元测试,以了解它是否有意义或应该更改。这里没有多少人愿意这么做。我个人的两分钱:你的代码看起来很复杂;相应的单元测试看起来也过于复杂也就不足为奇了。我的建议:订购Robert Martin的“干净代码:敏捷软件工艺手册”。读两三遍。开始练习。一年后,你的代码会更好。(这对我和我的单元测试都有效)。@EddyG我认为我不能简化我的代码。在一天结束的时候,应该有一个“流程管理器”——只将工作委托给其他验证者。不是吗?@user1065869我想说的是:两年前,我可能会编写与您类似的代码。数月的学习和实践清洁代码;我相信我的代码现在的结构要好得多;容易掌握;而且更容易测试。当我尝试应用TDD时。。。“测试”“驱动”我的“开发”;意思:我的单元测试变得更简单,因为我以一种更容易测试的方式编写类。但这在这里是无法解释的。。。
@Test
public void checkAltWith2() throws Exception {
DescriptiveDelta descriptiveDelta = new DescriptiveDelta();
descriptiveDelta.delta = Delta.IDENTICAL;
when(segmentsIdsCheckerMock.checkSegmentsIdsUnorderedIdentity(any(ResponseShort.class), any(ResponseShort
.class)))
.thenReturn(descriptiveDelta);
AlternativeShortTotalChecker alternativeShortTotalChecker =
new AlternativeShortTotalCheckerBuilder()
.setAlternativeDistanceChecker(alternativeDistanceCheckerMock)
.setAlternativeTimeChecker(alternativeTimeCheckerMock)
.setAStarVisitedChecker(aStarVisitedCheckerMock)
.setDeltaFromBaselineGenerator(deltaFromBaselineGeneratorMock)
.setGlobalSettings(globalSettings)
.setInstructionsChecker(instructionsCheckerMock)
.setRouteNameChecker(routeNameCheckerMock)
.setSegmentsIdsChecker(segmentsIdsCheckerMock)
.createAlternativeShortTotalChecker();
CompleteRoutingResponseShort currentResponse = routingResponsesInMemoryFactory.getOneAlternative();
CompleteRoutingResponseShort baselineResponse = routingResponsesInMemoryFactory.getOneAlternative();
alternativeShortTotalChecker.checkAllAlternativesShort(currentResponse, baselineResponse);
verify(aStarVisitedCheckerMock).checkAStarCountPerAlt(any(ResponseShort.class), any(ResponseShort.class));
verify(segmentsIdsCheckerMock).checkSegmentsIdsUnorderedIdentity(any(ResponseShort.class), any(ResponseShort
.class));
verify(instructionsCheckerMock).checkTotalInstructionIdentity(any(ResponseShort.class), any(ResponseShort
.class));
verify(routeNameCheckerMock).checkRouteNameIdentity(any(ResponseShort.class), any(ResponseShort.class));
verify(alternativeDistanceCheckerMock, times(0)).checkTotalDistanceIdentity(any(ResponseShort.class), any
(ResponseShort.class));
verify(alternativeTimeCheckerMock, times(0)).checkTotalTimeIdentity(any(ResponseShort.class), any
(ResponseShort.class));
}