EasyMock и параметризованные тесты (JUnit параметризованный) - PullRequest
0 голосов
/ 15 мая 2018

Я хотел бы использовать @Mock для класса внутри параметризованного тестового класса. Но по некоторым причинам mockClassB имеет значение NULL. Мой код похож на

@RunWith(Parameterized.class)
public class ClassATest extends EasyMockSupport {

    private String uniqueIdentifier;
    private String value;

    @Mock
    private ClassB mockClassB;

    public ClassATest(String uniqueIdentified, String value) {
        this.uniqueIdentifier = uniqueIdentified;
        this.value = value;
    }

    ...

    @Parameterized.Parameters(name = "{index}: id = {0}; value = {1}")
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {"1", "val1"},
                {"2", "val2"}});
    }

    @Test
    public void testMethod() {
        ...
        expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value);   // mockClassB is NULL
        replayAll();
        ....
    }
}

Можно ли создать макет объекта внутри параметризованного класса?

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Правильный код будет выглядеть следующим образом

@RunWith(Parameterized.class)
public class ClassATest extends EasyMockSupport {

    private String uniqueIdentifier;
    private String value;

    private ClassB mockClassB;

    public ClassATest(String uniqueIdentified, String value) {
        this.uniqueIdentifier = uniqueIdentified;
        this.value = value;
    }

    ...

    @Parameterized.Parameters(name = "{index}: id = {0}; value = {1}")
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
               {"1", "val1"},
               {"2", "val2"}});
    }

    @Before
    public void setup() {
        ...
        mockClassB = mock(ClassB.class);
        ...
    }

    @Test
    public void testMethod() {
       ...
       expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value);   // mockClassB will be mocked :)
       replayAll();
       ....
    }
}
0 голосов
/ 16 мая 2018

EasyMock требуется правило или бегун для создания экземпляров аннотированных макетов. Поскольку вы уже используете бегуна, единственным вариантом для вас является правило. Следующее будет работать.

@RunWith(Parameterized.class)
public class ClassATest extends EasyMockSupport {

    @Rule
    public EasyMockRule rule = new EasyMockRule(this);

    private String uniqueIdentifier;
    private String value;

    @Mock
    private ClassB mockClassB;

    public ClassATest(String uniqueIdentified, String value) {
        this.uniqueIdentifier = uniqueIdentified;
        this.value = value;
    }

    @Parameterized.Parameters(name = "{index}: id = {0}; value = {1}")
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {"1", "val1"},
                {"2", "val2"}});
    }

    @Test
    public void testMethod() {
        expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value);   // mockClassB is NULL
        replayAll();
    }
}

Альтернативой является прямой вызов injectMocks, который доступен на EasyMockSupport.

@RunWith(Parameterized.class)
public class ClassATest extends EasyMockSupport {

    private String uniqueIdentifier;
    private String value;

    @Mock
    private ClassB mockClassB;

    public ClassATest(String uniqueIdentified, String value) {
        this.uniqueIdentifier = uniqueIdentified;
        this.value = value;
    }

    @Before
    public void before() {
        injectMocks(this);
    }

    @Parameterized.Parameters(name = "{index}: id = {0}; value = {1}")
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {"1", "val1"},
                {"2", "val2"}});
    }

    @Test
    public void testMethod() {
        expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value);   // mockClassB is NULL
        replayAll();
    }
}
0 голосов
/ 15 мая 2018

Попробуйте добавить метод setUp:

@Before
public void setUp() {
    initMocks(this);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...