gan*_*rey 3 java junit dependency-injection mocking
我的代码是这样设置的。
abstract class BaseController {
@Inject Store store;
}
class MyController extends BaseController {
private final Validator validator;
@Inject
public MyController(Validator validator) {
this.validator = validator;
}
public boolean someMethod() {
a = store.storingMethod();
b = validator.validate(a);
...
...
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想为myController
. 在测试中,我想使用注入的Store
但我想模拟Validator
. 我试过这样的事情。
@RunWith(MockitoJUnitRunner.class)
public class MyControllerTest() {
private MyController myController;
@Mock private Validator validator;
@Before
public void before() {
myController = new MyController(validator);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道,如果我Store store
从BaseController
to移动MyController
,我可以在构造函数中初始化它(就像我对验证器所做的那样)。但是,我希望在 Base 类中有 Store,因为它会被其他扩展它的类使用。
根据我的课程设置方式,如何Store
在测试时注入?
不要使用字段注入。使用构造函数注入。
abstract class BaseController {
final Store store;
BaseController(Store store) {
this.store = store;
}
}
class MyController extends BaseController {
private final Validator validator;
@Inject
public MyController(Validator validator, Store store) {
super(store);
this.validator = validator;
}
}
Run Code Online (Sandbox Code Playgroud)
关于这个主题有一些争论,但是您的示例清楚地说明了使用字段注入使类更难测试的情况。
还值得注意的是
Spring团队普遍提倡构造函数注入