java - 使用私有字段和@PostConstruct 对 Spring 引导服务进行单元测试
问题描述
我有一个这样定义的 Spring 引导服务
@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
使用构造函数注入来获取所需AnotherService
bean 的 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
有一个构造函数。请参阅此处了解更多信息。
使用 Spring 进行测试
使用@RunWith ( SpringRunner.class ) 和@SpringBootTest注入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
接口实现,它允许您进行纯单元测试。
推荐阅读
- reactjs - 如何在 React 中获取 URL 参数?localhost:3000/reset-password/:token
- ios - 无法将用户登录到领域对象服务器(在我的 Mac 上本地)
- cassandra - Cassandra 顺序修复不会一次修复所有节点?
- apache-spark - 为什么加载 Cobol Copybook 文件失败并显示“ClassNotFoundException:java.time.temporal.TemporalAccessor”?
- c++ - 为什么子类对象调用母类的成员函数?
- php - 在 Laravel Observer 中不跟踪像创建、更新、删除这样的雄辩事件
- r - 如何修复错误消息“回合错误(pwfst,3):数学函数的非数字参数”
- c++ - C++ 神秘结构赋值与 int 截断
- javascript - 如何计算动态表每行总计
- excel - 如何跟踪 google doc 文件名更改历史记录?