关于包含带参数的方法的类的EasyMock

时间:2014-06-12 00:15:43

标签: java easymock

我想知道如何使用EasyMock为包含带参数的方法的类编写测试用例并返回一些对象。如果不够详细,请告诉我。我做了几个小时的努力来解决它。所以我现在选择了stackoverflow。

以下是我正在尝试锻炼的XYZ类中存在的方法

public static Identifier getMachineIdentifierFor( Machine machine ) {
    Identifier identifier = new IdentifierImpl();
    identifier.setMachine(machine.getMachine());
    identifier.setMachineIdentifierType(machine.getMachineIdentifierType());
    return identifier;
}

以下是Machine类的外观(只是示例...我在复制到此处时跳过了getter和setter)

public class MachineImpl implements Machine {
    private String machine;
    private MachineIdentifierType machineIdentifierType;
    //@followed by some strings and getters and setters for the corresponding fields
}

以下是标识符的外观

public class IdentifierImpl implements Identifier {
    private String machine;
    private machineIdentifierType machineIdentifierType; 

    public void setInstrument(String machine) {
        this.machine = machine;
    }

    public String getMachine() {
        return machine;
    }

    public MachineIdentifierType getMachineIdentifierType() {
        return machineIdentifierType;
    }

    public void setInstrumentIdentifierType(MachineIdentifierType machineIdentifierType) {
        this.machineIdentifierType = machineIdentifierType;
    }
}

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

对于像你想要测试的方法一样,我认为我不会使用模拟来测试它。我可能会写一个这样的测试:

@Test
public void thatMachineIdentifierIsCreatedWithMachineAndType() {
    final String machineString = "machine";
    final MachineIdentifierType machineIdType = new MachineIdentifierType();

    final Machine machine = new Machine();
    machine.setMachine( machineString );
    machine.setMachineIdentifierType( machineIdType );

    final Identifier identifier = XYZ.getMachineIdentifierFor( machine );
    assertThat( identifier.getMachine(), is(machineString));
    assertThat( identifier.getMachineIdentifierType(), is( machineIdType ));
}

现在,说过我不会用模拟测试这个,就可以做到这一点。

您有两个选择:

  1. 模拟Machine类并检查返回的值是否在返回的Identifier对象中。这是一个用于模拟的用法用例,使用EasyMock非常简单易用。
  2. 模拟机器类和IdentifierImpl构造函数调用并检查模拟标识符是否使用机器模拟器中的getter结果调用setter。这更加复杂,只有EasyMock才能实现,它也需要PowerMock
  3. 选项1:

    模拟传递给方法的Machine对象并设置方法调用的期望。这使用标准期望,重放和验证方法形成EasyMock。测试看起来像这样:

    @Test
    public void thatInteractionWithMachineIsAsExpected() {
        final String machineString = "machine";
        final MachineIdentifierType machineIdType = new MachineIdentifierType();
    
        final Machine mockedMachined = EasyMock.createMock(Machine.class);
        EasyMock.expect( mockedMachined.getMachine() ).andReturn( machineString );
        EasyMock.expect( mockedMachined.getMachineIdentifierType() ).andReturn( machineIdType );
    
        EasyMock.replay( mockedMachined );
    
        final Identifier identifier = XYZ.getMachineIdentifierFor( mockedMachined );
        assertThat( identifier.getMachine(), is(machineString));
        assertThat( identifier.getMachineIdentifierType(), is( machineIdType ));
    
        EasyMock.verify( mockedMachined );
    }
    

    选项2:

    这更加复杂和复杂。我并不是真的采用这种方法来解决我已经提到过的其他两种方法,但我将其作为知识共享练习包含在其他任何方面。

    使用模拟测试方法的主要问题是您实例化了一个您可能想要模拟的对象。实例化是大多数模拟框架的杀手,但可以使用PowerMock进行处理。它不能用EasyMock完成,它超出了该库的设计范围。

    PowerMock能够模拟对指定类的构造函数的调用。它也可以做一些其他奇妙的事情,但我会留给你找出,(documentation here)。在您的情况下,它可以用于调用IdentifierImpl构造函数返回一个模拟对象,然后您可以设置您的期望。

    然后,您还可以模拟提供给方法的Machine对象,并设置对此的期望。

    它有点粗糙(因此我不会在这种类型的测试中使用这种技术),但这是一个使用PowerMock和EasyMock测试你的方法的测试。

    @Test
    public void thatInteractionWithMachineAndIdentifierIsAsExpected() throws Exception {
        final String machineString = "machine";
        final MachineIdentifierType machineIdType = new MachineIdentifierType();
    
        final Machine mockedMachined = EasyMock.createMock(Machine.class);
        EasyMock.expect( mockedMachined.getMachine() ).andReturn( machineString );
        EasyMock.expect( mockedMachined.getMachineIdentifierType() ).andReturn( machineIdType );
    
        final IdentifierImpl mockedIdentifierImpl = EasyMock.createMock(IdentifierImpl.class);
        mockedIdentifierImpl.setMachine(machineString);
        EasyMock.expectLastCall();
        mockedIdentifierImpl.setMachineIdentifierType( machineIdType );
        EasyMock.expectLastCall();
    
        PowerMock.expectNew(IdentifierImpl.class).andReturn( mockedIdentifierImpl );
    
        PowerMock.replayAll();
    
        final IdentifierImpl identifier = (IdentifierImpl) XYZ.getMachineIdentifierFor( mockedMachined );
        assertThat( identifier, is( mockedIdentifierImpl ) );
    
        PowerMock.verifyAll();
    }