Как использовать thenReturn () с внедренным классом @Mock? - PullRequest
0 голосов
/ 19 октября 2018

В тестовом случае Mockito BClass вводится в AClass.Я хочу определить возвращаемое значение для b.doSomething (), который будет вызываться в a.askBSomething ().

Однако мой AClass не имеет функции конструктора, поэтому я не могу передать b в a в модульном тесте,Есть ли обходной путь для этого?

@RunWith(MockitoJUnitRunner.class)
public class AClassTest {
    @Mock
    BClass b;

    @InjectMocks
    AClass a = new AClass();

    @Before
    public void setUp() throws Exception {
        when(b.doSomething()).thenReturn("something");
    }

    @Test
    public void test() {
        assertTrue(a.askBSomething());
    }
}

public class AClass {

    @Inject
    private BClass b;

    public boolean askBSomething() {
        String result = b.doSomething(); // result will be null instead of "something"
        //.....  
    }
}

Заранее спасибо.

1 Ответ

0 голосов
/ 19 октября 2018

Да, есть.
Вы можете использовать отражение, чтобы установить макет в AClass после вызова c'or класса AClass.

Просто добавьте следующий метод и вызовите его в вашем setUp ().

private void setMockB(AClass objectA, BClass mockB)
{
    Field bField = AClass.class.getDeclaredField("b");
    bField.setAccessible(true);
    bField.set(objectA, mockB)
}

В качестве альтернативы, вы можете добавить открытый сеттер для b и вызвать его в setUp ().

...