Насмешка над конечной переменной класса - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь протестировать класс, в котором используется последний экземпляр класса. Я не понимаю, как создать макет этого конечного объекта (в нашем примере foo). После долгих раскопок я начал использовать powermockito и метод whenNew. Я не уверен, правильно ли я это делаю или нет, так как я новичок в JUnits. Посмотрев на это, я изменил @PrepareForTest на Sample.class (ранее это было Foo.class), и после этого и foo, и koo обнуляются.

Class Foo

public class Foo{
  void hello(){
  }
}

Образец класса

public class Sample{
  private final Foo foo= new Foo();
  private Koo koo = new Koo();
  String run(){
    String strr = koo.something();
    return foo.hello();
  }
}

Тестовый класс

@RunWith(PowerMockRunner.class)
@PrepareWith({Sample.class})
public class SampleTest{
  @InjectMocks
  private Sample sample;

  @Mock
  private Koo koo;

  @Test
  void run(){
    Foo foo = PowerMockito.mock(Foo.class);
    PowerMockito.whenNew(Foo.class).withNoArguments.thenReturn(foo);

    when(koo.something()).thenReturn("abc");
    when(foo.hello()).thenReturn("def");
    String check = sample.run();
    assertEquals("abc", check);
  }
}

1 Ответ

0 голосов
/ 29 апреля 2020

foo - это переменная экземпляра, которая будет инициализирована при создании экземпляра класса Sample. Если вы хотите смоделировать эту переменную экземпляра, используя whenNew , то это должно произойти, пока класс Sample загружается до выполнения тестового метода.

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Sample.class })
public class SampleTest {

  @InjectMocks
  private Sample sample;

  @BeforeClass 
  public static void setUp() throws Exception {

    Foo foo = PowerMockito.mock(Foo.class);
    Mockito.when(foo.hello()).thenReturn("def");
    PowerMockito.whenNew(Foo.class).withNoArguments().thenReturn(foo);
  }

  @Test
  public void run() throws Exception {

    String check = sample.run();
    Assert.assertEquals("def", check);
  }
} 
...