我有以下代码:
class Patient {
@Inject Syringe syringe;
@PostConstruct
void sayThankyouDoc() {
System.out.println("That hurt like crazy!");
}
}
@RunWith(MockitoJUnitRunner.class)
class TestCase {
@Mock
Syringe siringeMock;
@InjectMocks
Patient patient;
//...
}
我希望Mockito调用PostConstruct,但是我必须添加:
@Before
public void simulate_post_construct() throws Exception {
Method postConstruct = Patient.class.getDeclaredMethod("sayThankyouDoc", null);
postConstruct.setAccessible(true);
postConstruct.invoke(patient);
}
有一个更好的方法吗?
最佳答案
尽管这不是您问题的直接答案,但是我建议您远离字段注入(inject),而改用构造函数注入(inject)(使代码更具可读性和可测试性)。
您的代码如下所示:
class Patient {
private final Syringe syringe;
@Inject
public Patient(Syringe syringe) {
System.out.println("That hurt like crazy!");
}
}
那么您的测试将仅仅是:
@RunWith(MockitoJUnitRunner.class)
class TestCase {
@Mock
Syringe siringeMock;
Patient patient;
@Before
public void setup() {
patient = new Patient(siringeMock);
}
}
更新
正如Erik-Karl在注释中所建议的那样,您可以使用
@InjectMocks
摆脱设置方法。该解决方案之所以有效,是因为Mockito将使用适当的构造函数注入(inject)(如here所述)。代码如下:
@RunWith(MockitoJUnitRunner.class)
class TestCase {
@Mock
Syringe siringeMock;
@InjectMocks
Patient patient;
}