避免模拟Junit中Mock对象的底层方法调用



下面是我的代码。RestTemplateFactoryForMyApp是从哪里我得到RestTemplate对象。在其他类RestTemplateExampleClass,我正在测试。我使用它如下,它工作得很好。我已经编写了JUnit到RestTemplate调用,它也工作得很好。但是,当我在JUnit测试类中将下面的代码注释为restTemplateFactoryForMyApp.restTemplate()=NULL时,我得到NullPointerException。我怎样才能避免这种情况呢?假设我在RestTemplateFactoryForMyApp中调用了10个不同的类方法,那么我也必须为它们做同样的事情。那么我怎样才能避免呢?

@Configuration
public class RestTemplateFactoryForMyApp {

@Bean
public RestTemplate restTemplate() {

return new RestTemplate();
}


given(restTemplateFactoryForMyApp.restTemplate()).willReturn(restTemplate);
private final RestTemplate restTemplate = mock(RestTemplate.class);



@Autowired
private RestTemplateFactoryForMyApp restTemplateFactoryForMyApp;

restTemplateFactoryForMyApp.restTemplate().exchange
下面是我的JUnit测试restTemplate调用
@ExtendWith(MockitoExtension.class)
public class RestTemplateExampleTest {
@Mock
private RestTemplateFactoryForMyApp restTemplateFactoryForMyApp;
@InjectMocks
private RestTemplateExample restTemplateExample ;

private final RestTemplate restTemplate = mock(RestTemplate.class);


@BeforeEach
void setUp() throws Exception {
given(restTemplateFactoryForMyApp.restTemplate()).willReturn(restTemplate);
ReflectionTestUtils.setField(restTemplateExample, "id", 1);
}
@Test
public void mock_resttemplate() {
TodosObject todosObject = new TodosObject();
todosObject.setId(1);


System.out.println(" restTemplateFactoryForMyApp "  + restTemplateFactoryForMyApp.restTemplate());

int i = (int) ReflectionTestUtils.getField(restTemplateExample, "id");

System.out.println( " value of i " + i);

Mockito
.when(restTemplateFactoryForMyApp.restTemplate().exchange(
"https://jsonplaceholder.typicode.com/todos/" + i,
HttpMethod.GET,
null,
TodosObject.class
))
.thenReturn(new ResponseEntity<TodosObject>(todosObject, HttpStatus.OK));

我不完全确定你的问题,但也许returns_deep_stub有帮助:

@ExtendWith(MockitoExtension.class)
public class RestTemplateExampleTest {
@Mock(answer = RETURNS_DEEP_STUBS) 
private RestTemplateFactoryForMyApp restTemplateFactoryForMyApp;
@InjectMocks
private RestTemplateExample restTemplateExample;

@BeforeEach
void setUp() throws Exception {
ReflectionTestUtils.setField(restTemplateExample, "id", 1);
}
@Test
public void mock_resttemplate() {
TodosObject todosObject = new TodosObject();
todosObject.setId(1);


System.out.println(" restTemplateFactoryForMyApp "  + restTemplateFactoryForMyApp.restTemplate());

int i = (int) ReflectionTestUtils.getField(restTemplateExample, "id");

System.out.println( " value of i " + i);

Mockito
.when(restTemplateFactoryForMyApp.restTemplate().exchange(
"https://jsonplaceholder.typicode.com/todos/" + i,
HttpMethod.GET,
null,
TodosObject.class
))
.thenReturn(new ResponseEntity<TodosObject>(todosObject, HttpStatus.OK));

最新更新