Модульное тестирование: тестирование класса с внешним методом - PullRequest
0 голосов
/ 29 августа 2018
class A {
    int a;

    public int add() {
        B b = new B();
        a = b.calculate(4, 5);
        return a;
    }
}

class B {
    public int calculate(int x, int y) {
        return x * y;
    }
}

Я хочу протестировать класс A, где и не хотелось тестировать b.calculate () в методе add (). Поэтому мне нужно издеваться над классом B.

Вот мой код.

@Mock
B bclass;

A aclass;

@Before
public void setUp() {
    bclass = new B();
    aclass = new A();
}

@Test
public void testAClass() {
    when(bclass.calculate(4, 5)).thenReturn(45);
    assertEquals(45, aclass.add());
}

Тест не пройден. Что с ним не так?

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

Ваша проблема в скрытой зависимости класса A от класса B.

Ответ @Jens показал вам, как решить эту проблему с помощью PowerMock , но я считаю, что это отказ от вашего плохого дизайна.

Лучше было бы сделать эту зависимость явной , внедрив экземпляр класса B в объекты класса A предпочтительно в качестве параметров конструктора.
Предпочтительно использовать каркас внедрения зависимостей , такой как guice или spring.
Вы можете использовать Regulat Mockito конструкций.

class A {
    int a;
    private final B b;
    public A(B b){
      this.b=b;
    }
    public int add() {
        a = b.calculate(4, 5);
        return a;
    }
}

@Mock
B bclass;

A aclass;

@Before
public void setUp() {
    aclass = new A(bclass);
}

@Test
public void testAClass() {
    when(bclass.calculate(4, 5)).thenReturn(45);
    assertEquals(45, aclass.add());
}
0 голосов
/ 29 августа 2018

Аннотация @Mock уже генерирует экземпляр B. Здесь нам не нужно снова создавать экземпляр. Также убедитесь, что вы аннотируете с помощью Valid Runner или с помощью правила.

@RunWith(MockitoJUnitRunner.class)

Сообщите нам об ошибке, если она не работает. Вы также можете сослаться на ссылку ниже при использовании mockito.

http://www.vogella.com/tutorials/Mockito/article.html#mockito_usage

0 голосов
/ 29 августа 2018

Я не уверен, возможно ли это с Mockito. С PowerMockito это работает:

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class BTest {

    A aclass;

    B bMock;

    @Before
    public void setUp() throws Exception {
        bMock = PowerMockito.mock(B.class);
        PowerMockito.whenNew(B.class).withNoArguments().thenReturn(bMock);
        aclass = new A();
    }

    @Test
    public void testAClass() {
        Mockito.when(bMock.calculate(4, 5)).thenReturn(45);
        Assert.assertEquals(45, aclass.add());
    }
}
0 голосов
/ 29 августа 2018

Похоже, вы используете Mockit Framework. Вы можете попробовать сделать следующее:

new MockUp<B>() {

            @Mock
            int calculate(int x, int y) // no access modifier required
            {
               return 45; // your value
            }
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...