我在测试的类中有以下字段:

class ClassUnderTest {

  @Context
  public javax.ws.rs.core.SecurityContext securityContext;

  public void someMethod() {
    securityContext.getUserPrinciple(); // securityContext is always null here - never mocked
  }
}


但是我无法让JMockit使用期望值或MockUp方法来模拟它,在这两种情况下,被测试的类中的securityContext始终为null?

@Test
public void usingExpectations() {
  new Expectations() {
    @Mocked
    SecurityContext mockSecurityContext;
    @Mocked
    Principal mockPrinciple;
    {
      mockSecurityContext.getUserPrincipal();
      result = mockPrinciple;

      mockPrinciple.getName();
      result = username;
     }
  };

  new ClassUnderTest().someMethod();
}

@Test
public using usingMockUp() {
  new MockUp<SecurityContext>() {
    @Mock
    Principle getUserPrincipal() {
      // return something
    };
  }
  new ClassUnderTest().someMethod();
}

最佳答案

您的测试代码没有做任何事情来设置securityContext字段,因此它保持为空。

不过,JMockit具有此功能。您可以通过调用Deencapsulation.setField(...)显式设置字段,或者让JMockit通过使用@Tested@Injectable注释自动进行设置。有关详细信息和示例,请检查documentation

10-07 21:03