Запретить вызов функции в конструкторе во время издевательства, Mockito? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть класс, который при создании не может вызывать определенный метод.

public class ClassA() {
    @NonNull
    private ClassB b;

    public ClassA() {
        this.b = (new ClassC()).mymethod();
    }
}

Мне нужно протестировать ClassA без вызова Class C (). Mymethod (), потому что его вызов вызовет ошибка. Как лучше всего это сделать? Я пробовал @InjectMocks для ClassA с @Mock Class C, но это дает мне нулевые исключения.

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Вы должны реорганизовать свой класс, чтобы сделать его более тестируемым. Два дополнительных конструктора в следующем фрагменте кода можно использовать в тестах с макетами для Class C или ClassB:

public class ClassA() {

    @NonNull
    private ClassB b;

    public ClassA {
       this(new ClassC());
    }

    public ClassA(ClassC c) {
        this(c.mymethod());
    }

    public ClassA(ClassB b) {
        this.b = b;
    }
}

Пример тестового примера:

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.Test;

public class ClassATest {

  @Test
  public void test() {

    ClassB b = mock(ClassB.class);
    // ... setup your mock for b

    ClassC c = mock(ClassC.class);
    when(c.mymethod()).thenReturn(b);

    ClassA a = new ClassA(c);
    // ... call the method of "a" you want to test
  }
}
0 голосов
/ 18 июня 2020

Вы можете использовать CALLS_REAL_METHODS, чтобы избежать вызова конструктора ClassA

@RunWith(MockitoJUnitRunner.class)
public class ClassATest {

    @Mock
    private ClassB b;

    private ClassA classA;

    @Before
    public void setUp() {
        classA = mock(ClassA.class, org.mockito.Mockito.CALLS_REAL_METHODS);
        whitebox.setInternalState(classA, "b", b);
    }

   @Test
   public void shouldDoSomething() {
       // your test
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...