Если у меня Mockito.Spy () / @ Spy не работает с FieldSetter? Как работать при совместном использовании @Spy и FieldSetter? - PullRequest
0 голосов
/ 09 июля 2020

Если я использую @Spy, это поможет мне издеваться над методами. но он не работает для инициализации частных переменных

FieldSetter.setField(discoveryService, discoveryService.getClass().getDeclaredField("discoveryURL"), discoveryUrl);

Если я удалю @spy, FieldSetter будет инициализировать фиктивные частные переменные. Мой код с @spy:

           @InjectMocks
/*line 5*/ @Spy
    private Class object;
     
    @Test
    void getFetchDiscoveryTest() throws IOException, NoSuchFieldException {

        String discoveryUrl = "https://ffc-onenote.officeapps.live.com/hosting/discovery";

/*line 15*/ FieldSetter.setField(object, object.getClass().getDeclaredField("discoveryURL"), discoveryUrl);
/*line 16*/ doThrow(IOException.class).when(object).getBytes(any());
/*line 17*/ when(object.getBytes(any())).thenThrow(new IOException("IO issue"));
        assertThrows(Exception.class, () -> object.getWopiDiscovery());

здесь, если я поставил строку № 5, то строка № 15 не работает, а строка № 16 работает нормально. почему, если у меня есть @spy, FieldSetter не работает. как заставить FieldSetter работать и с @spy?

1 Ответ

1 голос
/ 09 июля 2020

вы можете ввести значения для частных атрибутов экземпляра, используя org.springframework.test.util.ReflectionTestUtils

@Service
public class SampleDiscoveryService{

    @Value("${props.discoveryUrl}")
   private String discoveryUrl;
}

Скажем, выше это класс обслуживания, значение для discoveryUrl может быть введено с помощью


   @ExtendWith(MockitoExtension.class)
class SampleDiscoveryServiceTest {

    @InjectMocks
    private SampleDiscoveryService sampleDiscoveryService = null;

    @BeforeEach
    void setup() {
       ReflectionTestUtils.setField(sampleDiscoveryService, "discoveryUrl", "https://ffc-onenote.officeapps.live.com/hosting/discovery");
    }


...