мой фиктивный junit5 не работает с моим подклассом - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть система, которая использует другую систему, и я пытаюсь ее протестировать, но я не хочу постоянно вызывать внешнюю систему.

my system -> my http url -> inside the code i call external system
                                           |
  output <- process response <------------

в идеале я хочу подделать / смоделировать данные, чтобы я мне не нужно вызывать внешнюю систему

мой код

class MMarket {
 @GetController("/stock/{stock}"
 public String loadStockFromYahoo(@PathVariable("stock") String stock) {
   LoadStock stockObject = new LoadStock();
   String result = stockObject.getYahoo(stock);
   return result;
 }

}

мой класс, который я хочу высмеять

class LoadStock{

...
  public String getYahoo(String stock) {
    RestTemplate restTemplate = new RestTemplate();
    String result = restTemplate.getForObject("my url with + stock", String.class);
    return result;
  }
}

в моем тесте я делаю:

@SpringBootTest
@ExtendWith(MockitoExtension.class) //junit5
@RunWith(JUnitPlatform.class)
class MMarketTest {



    @Autowired MMarket mMarket;

    @Mock LoadStock loadStock;
    @BeforeEach
    void setUp() {
        when(loadStock.getYahoo(any())).thenReturn("123");
    }

    @Test
    void test1() {

        String result = mMarket.loadStockFromYahoo("mystock");
    }

}

«Строковый результат» - это результат вызова restTemplate.getForObject, НЕ МОЯ подделка, которая, если я хочу многократно тестировать, вызовет внешнюю систему, которую я не хочу

1 Ответ

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

Вы можете использовать PowerMocktio для инициализации и передачи вашего смоделированного LoadStock

@PrepareForTest(MMarket.class)
@RunWith(PowerMocktio.class)
class MMarketTest {

    private MMarket mMarket;

    @Mock LoadStock loadStock; // will be injected to MMarket

    @BeforeEach
    void setUp() {
        when(loadStock.getYahoo(any())).thenReturn("123");
    }

    @Test
    void test1() {
     PowerMockito.whenNew(LoadStock.class).withNoArguments()
     .thenReturn(mockedLoadStock);
        String result = mMarket.loadStockFromYahoo("mystock");
    }
}

. Если вы не можете использовать PowerMocktio, вы можете автоматически подключить LoadStock и в тестовом режиме @InjectMocks

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
class MMarketTest {

    @Autowired
    @InjectMocks
    MMarket mMarket;

    @Mock LoadStock loadStock; // will be injected to MMarket

    @BeforeEach
    void setUp() {
        when(loadStock.getYahoo(any())).thenReturn("123");
    }

    @Test
    void test1() {
        String result = mMarket.loadStockFromYahoo("mystock");
    }
}
...