Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用mockito时出现空指针问题_Java_Spring_Junit_Mockito - Fatal编程技术网

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来模拟存根对象的methodPure
mockito
在这里帮不了你。您可以使用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);