我有以下代码:

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;

}

10-07 19:00
查看更多