Java 如何使用JUnit为这个类编写单元测试?
这是我从头开始编写的第一个单元测试。我想测试这5个条件(Java 如何使用JUnit为这个类编写单元测试?,java,unit-testing,junit,Java,Unit Testing,Junit,这是我从头开始编写的第一个单元测试。我想测试这5个条件(会员,会议活动,服务活动,信函活动和接收活动)。我使用eclipse快捷方式生成JUnit测试用例。我已经阅读了关于JUnit测试的文章,仍然需要一些指导。这是我到目前为止所拥有的 如何调用该方法来测试条件 @Test public void testBuild() { Member memberActivity(String memberId) { Member activity = new Member();
会员
,会议活动
,服务活动
,信函活动
和接收活动
)。我使用eclipse快捷方式生成JUnit测试用例。我已经阅读了关于JUnit测试的文章,仍然需要一些指导。这是我到目前为止所拥有的
如何调用该方法来测试条件
@Test
public void testBuild() {
Member memberActivity(String memberId) {
Member activity = new Member();
activity.setDeliveryType("Some Delivery Type");
activity.setDocumentType("Some Document Type");
return activity;
}
}
下面是课堂:
public class MessageBuilder {
private final EventPayload messagePayload;
public MessageBuilder(){
messagePayload = new EventPayload();
}
public EventPayload build(Activity event) {
createBaseActivity(event);
if (event instanceof Member) {
updateToMemberActivity(event);
return messagePayload;
}
if (event instanceof MeetingActivity) {
updateToMeetingActivity(event);
return messagePayload;
}
if (event instanceof ServiceActivity) {
updateToServiceActivity(event);
return messagePayload;
}
if (event instanceof LetterActivity) {
updateToLetterActivity(event);
return messagePayload;
}
if (event instanceof ReceiptActivity) {
updateToReceiptActivity(event);
return messagePayload;
}
return messagePayload;
}
private EventPayload createBaseActivity(Activity event) {
messagePayload.setId(event.getId());
messagePayload.setMemberId(event.getMemberId());
messagePayload.setActivityDateTime(event.getActivityDateTime());
messagePayload.setMemberIdIsPrimaryId(event.isMemberIdIsPrimaryId());
messagePayload.setBuCode(event.getBuCode());
messagePayload.setStateCode(event.getStateCode());
messagePayload.setProductCode(event.getProductCode());
messagePayload.setBusinessUnit(event.getBusinessUnit());
messagePayload.setActivityType(event.getActivityType());
messagePayload.setActivityIntent(event.getActivityIntent());
messagePayload.setActivityAction(event.getActivityAction());
messagePayload.setActivityStatus(event.getActivityStatus());
messagePayload.setSourceSystem(event.getSourceSystem());
messagePayload.setCaseId(event.getCaseId());
messagePayload.setInitiatedBy(event.getInitiatedBy());
messagePayload.setActivityDetailsPointer(event.getActivityDetailsPointer());
messagePayload.setBusinessLine(event.getBusinessLine());
messagePayload.setEventInstanceType(EventInstanceType.ACTIVITY.name());
return messagePayload;
}
private EventPayload updateToMemberActivity(Activity event) {
Member subTypedEvent = (Member) event;
messagePayload.setDeliveryType(subTypedEvent.getDeliveryType());
messagePayload.setDocumentType(subTypedEvent.getDocumentType());
messagePayload.setEventInstanceType(EventInstanceType.MEMBER.name());
return messagePayload;
}
private EventPayload updateToMeetingActivity(Activity event) {
MeetingActivity subTypedEvent = (MeetingActivity) event;
messagePayload.setDeliveryType(subTypedEvent.getDeliveryType());
messagePayload.setDocumentType(subTypedEvent.getDocumentType());
messagePayload.setEventInstanceType(EventInstanceType.MEETING.name());
return messagePayload;
}
private EventPayload updateToServiceActivity(Activity event) {
ServiceActivity subTypedEvent = (ServiceActivity) event;
messagePayload.setReceivedBy(subTypedEvent.getReceivedBy());
messagePayload.setConcernedParty(subTypedEvent.getConcernedParty());
messagePayload.setSummary(subTypedEvent.getSummary());
messagePayload.setEventInstanceType(EventInstanceType.SERVICE.name());
return messagePayload;
}
private EventPayload updateToLetterActivity(Activity event) {
LetterActivity subTypedEvent = (LetterActivity) event;
messagePayload.setDeliveryType(subTypedEvent.getDeliveryType());
messagePayload.setDocumentType(subTypedEvent.getDocumentType());
messagePayload.setPaymentType(subTypedEvent.getPaymentType());
messagePayload.setEventInstanceType(EventInstanceType.LETTER.name());
return messagePayload;
}
private EventPayload updateToReceiptActivity(Activity event) {
ReceiptActivity subTypedEvent = (ReceiptActivity) event;
messagePayload.setPaymentType(subTypedEvent.getPaymentType());
messagePayload.setEventInstanceType(EventInstanceType.RECEIPT.name());
return messagePayload;
}
}
我希望覆盖率达到100%。覆盖所有分支的最简单方法是为类提供特定类型的模拟 Java世界中有许多我更喜欢的模拟框架 当您必须为每个活动子类指定模拟时 e、 g 对于在这个模拟中调用的每个函数,您都应该指定一个返回值,它可以在生成的EventPayload上进行检查,如下所示
when(memberMock.getId()).thenReturn(4711);
检查成员分支的测试的简短版本如下所示:
Member memberMock = Mockito.mock(Member.class);
when(memberMock.getId()).thenReturn(4711);
//[...] here are the other calls mocked [...]
MessageBuilder messageBuilder = MessageBuilder();
EventPayload testSubject = messageBuilder.build(memberMock)
assertEquals(testSubject.id, 4711)
//[...] other asserts [...]
您也可以考虑重构类以获得更好的体系结构和更好的可测试性,但这超出了此解释的范围首先您需要编写一个有效的方法。您的测试代码不是有效的Java代码:您不能在另一个方法中定义方法。然后,对于任何测试,测试方法都需要执行要测试的代码,并检查代码是否正确。因此,它需要创建一个MessageBuilder,调用其build()方法,并根据您的规范检查返回的值是否正确。请注意,您的构建器总是变异并返回相同的对象,这很可能不是它应该做的。请编辑您的标题以使其更具体。这个特殊的类会引起您对编写单元测试的关注吗?这个问题与关于单元测试的所有其他问题有何不同?
Member memberMock = Mockito.mock(Member.class);
when(memberMock.getId()).thenReturn(4711);
//[...] here are the other calls mocked [...]
MessageBuilder messageBuilder = MessageBuilder();
EventPayload testSubject = messageBuilder.build(memberMock)
assertEquals(testSubject.id, 4711)
//[...] other asserts [...]