Java 使用mockito时出现空指针问题
我在尝试一种方法。在这个方法中,一个新对象被实例化,但我不想要它,否则其他类将被测试。 我如何告诉莫基托不要说出来Java 使用mockito时出现空指针问题,java,spring,junit,mockito,Java,Spring,Junit,Mockito,我在尝试一种方法。在这个方法中,一个新对象被实例化,但我不想要它,否则其他类将被测试。 我如何告诉莫基托不要说出来 @Component @EnableScheduling public class VerificadorDeNovasAssinaturas { private DocuSign docuSign; private ApiClient apiClient; @Autowired private DocuSignProperties docuSi
@Component
@EnableScheduling
public class VerificadorDeNovasAssinaturas {
private DocuSign docuSign;
private ApiClient apiClient;
@Autowired
private DocuSignProperties docuSignProperties;
public EnvelopesInformation verificaNovasAssinaturas() throws Exception {
this.docuSign = new DocuSign(docuSignProperties); // I don't want mockito instanciate DocuSign
this.apiClient = docuSign.getApiClient();
this.apiClient.addDefaultHeader("Authorization", "Bearer " + docuSign.getoAuthToken().getAccessToken());
我的测试班:
@SpringBootTest
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
public class VerificadorDeNovasAssinaturasTest {
@InjectMocks
private VerificadorDeNovasAssinaturas verificador;
private DocuSignProperties docuSignProperties;
private ApiClient apiClient;
private UserInfo userInfo;
private OAuthToken oAuthToken;
@Mock
private DocuSign docuSign;
@Before
public void initialize() throws Exception {
docuSignProperties = new DocuSignProperties();
docuSignProperties.setBaseUrl("https://demo.docusign.net/restapi");
docuSignProperties.setBasePath("/restapi");
setApiClientConfigurations();
when(docuSign.getApiClient()).thenReturn(this.apiClient);
when(docuSign.getoAuthToken()).thenReturn(this.oAuthToken);
...}
private void setApiClientConfigurations() throws Exception {
this.apiClient = new ApiClient(this.docuSignProperties.getBaseUrl());
this.oAuthToken = getOAuth();
... }
@Test
public void testaVerificacaoDeNovasAssinaturas() throws Exception {
EnvelopesInformation results = verificador.verificaNovasAssinaturas();
assertNotNull(results);
}
我不希望mockito实例化一个新的DocuSign,因为这不是测试的原因。有一些方法可以忽略这一步吗?好吧,如果你的代码(你打算测试的代码)做了一些事情,Mockito不能改变一些事情,但是你可以对它进行模拟,这样它就不会创建新的对象(而是拥有你的“模拟对象”),这样你就可以根据预期的行为来验证一些事情 在您的代码中,如果您只需更改几行代码,就可以实现您想要的,比如- 创建一个DocuSignService类,然后在这里用some-getDocuSign方法创建这个新对象。那么您的代码如下所示-
@Autowired
private DocuSignService docuSignService ;
this.docuSign = new DocuSign(docuSignProperties); // This is what you have
this.docuSign = this.docuSignService.getDocuSign() ; // This is new code
现在在您的测试用例中-
@Mock
DocuSignService docuSignService ;
@Mock
private DocuSign docuSign;
//.
//.
Mockito.when(this.docuSignService.getDocuSign()).thenReturn(docuSign);
现在你可以控制这个对象了。好吧,如果你的代码(你打算测试的代码)做了什么,Mockito就不能改变什么,但是你可以模拟它,这样它就不会创建一个新的对象(而是拥有你的“模拟对象”),这样你就可以根据预期的行为验证一些东西
I resolved it using powerMockito.
DocuSign docuSign = PowerMockito.mock(DocuSign.class);
PowerMockito.whenNew(DocuSign.class).withAnyArguments().thenReturn(docuSign);
在您的代码中,如果您只需更改几行代码,就可以实现您想要的,比如-
创建一个DocuSignService类,然后在这里用some-getDocuSign方法创建这个新对象。那么您的代码如下所示-
@Autowired
private DocuSignService docuSignService ;
this.docuSign = new DocuSign(docuSignProperties); // This is what you have
this.docuSign = this.docuSignService.getDocuSign() ; // This is new code
现在在您的测试用例中-
@Mock
DocuSignService docuSignService ;
@Mock
private DocuSign docuSign;
//.
//.
Mockito.when(this.docuSignService.getDocuSign()).thenReturn(docuSign);
现在你可以控制这个对象了。Pure
mockito
在这里帮不了你。您可以使用powermockito的新功能将其替换为模拟。否则,您将不得不重构代码,以提供作为依赖项的DocuSign
。如果您希望从模拟对象而不是模拟方法调用实际方法,可能会出现类似的情况。Stock MOCK\u Stock=Mockito.MOCK(Stock.class,调用\u REAL\u方法);使用mockito,您唯一能做的就是拥有新的DocuSign(docuSignProperties)代码>由单独的方法返回,您可以模拟该方法。但是无论如何,我想知道你现在从哪里得到空指针。你可以使用mockito来模拟存根对象的methodPuremockito
在这里帮不了你。您可以使用powermockito的新功能将其替换为模拟。否则,您将不得不重构代码,以提供作为依赖项的DocuSign
。如果您希望从模拟对象而不是模拟方法调用实际方法,可能会出现类似的情况。Stock MOCK\u Stock=Mockito.MOCK(Stock.class,调用\u REAL\u方法);使用mockito,您唯一能做的就是拥有新的DocuSign(docuSignProperties)代码>由单独的方法返回,您可以模拟该方法。但不管怎样,我想知道你现在从哪里得到一个空指针。你可以使用mockito来模拟存根对象的方法
I resolved it using powerMockito.
DocuSign docuSign = PowerMockito.mock(DocuSign.class);
PowerMockito.whenNew(DocuSign.class).withAnyArguments().thenReturn(docuSign);