我想知道在这种情况下编写单元测试的最佳方法是什么:
MyApi:
@RestController
public class MyApi{
@Autowired
MyAction myAction;
@PostMapping
public ResponseEntity addAction(@ResponseBody MyDto myDto){
return myAction.addAction(myDto);
}
}
MyAction:
@Service
public class MyAction{
@Autowired
private MyClient myClient;
public ResponseEntity<AuthenticationResponseDto> login(MyDto myDto{
return ResponseEntity.ok(myClient.addClient(myDto));
}
}
例如,是否必须添加构造函数?
谢谢
答案 0 :(得分:1)
使用构造函数注入是一种好习惯,但是,如果您不想使用它,则需要使用@Mock
和@InjectMocks
。它使用反射,不需要定义构造函数。
@RunWith(MockitoJUnitRunner.class)
public class Test {
@Mock
private Client client;
@InjectMocks
private ServiceImpl plannerService = new ServiceImpl();
@Test
public void test() throws Exception {
....
}
}
答案 1 :(得分:0)
我敢肯定有一种方法可以避免使用自动装配的构造函数,而只需自动装配一个字段,但是我使用构造函数是因为我认为这是一种好习惯。这样也可以轻松注入模拟对象
@Mock
MyAction myAction;
MyApi myApi;
ResponseEntity<AuthenticationResponseDto> testResponse = ResponseEntity.ok
(new AuthenticationResponseDto());
@Before
public void setup(){
myApi = new MyApi(myAction);
}
@Test
public void simpleMyApiTestExample (){
when(myAction.login(any())).thenAnswer(i-> testRespone);
ResponseEntity<?> actualResponse = myApi.addAction(new MyDto());
assertThat(actualResponse).isSameAs(testResponse);
}
只给您一个想法。我只是在SO文本编辑器中编写了此示例,因此对于任何错别字/错误都使用了广告。但是希望这表明为什么拥有构造函数对于测试自动装配的东西很有用。它允许您通过将实例添加到构造函数来模拟实例化所需的对象。在此示例中,这可能也适用于MyDto和AuthenticationResponseDto对象。