我有一个这样定义的 Spring boot 服务
@Service
public class MyService {
private String field1;
private String field2;
@Autowired
private AnotherService anotherService
@PostConstruct
public void init() {
anotherService.initField1(field1);
anotherService.initField2(field2);
}
public String foo() {
return field1 + field2;
}
}
我应该如何为 foo
编写单元测试。好吧,更多的是关于如何处理类字段和 PostConstruct
方法。
谢谢!!
编辑:
还添加了 AnotherService
作为字段。
最佳答案
以下示例显示了一个 @Service
Bean,它使用构造函数注入(inject)来获取所需的 AnotherService
bean:
@Service
public class MyService {
private String field1;
private String field2;
private final AnotherService anotherService;
public MyService(AnotherService anotherService) {
this.anotherService = anotherService;
this.anotherService.initField1(field1);
this.anotherService.initField2(field2);
}
public String foo() {
return field1 + field2;
}
}
请注意,您可以省略 @Autowired
,因为 MyService
有一个构造函数。请参阅here了解更多信息。
使用 Spring 进行测试
使用@RunWith ( SpringRunner.class ) 和 @SpringBootTest注入(inject) MyService
并开始使用它:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTest {
@Autowired
private MyService service;
@Test
public void testFoo() {
String expResult = "";
String result = service.foo();
assertEquals(expResult, result);
}
}
不使用 Spring 进行测试
public class MyServiceTest2 {
private MyService service;
@Before
public void setUp() {
service = new MyService(new AnotherService.Fake());
}
@Test
public void testFoo() {
String expResult = "";
String result = service.foo();
assertEquals(expResult, result);
}
}
这里Fake
是AnotherService
接口(interface)的假实现,它允许您进行纯单元测试。
关于java - 使用私有(private)字段和@PostConstruct对Spring boot服务进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52833014/