Java 如何使用JUnit为这个类编写单元测试?

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();

这是我从头开始编写的第一个单元测试。我想测试这5个条件(
会员
会议活动
服务活动
信函活动
接收活动
)。我使用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 [...]