java - 使用 mockito 的空指针问题
问题描述
我正在尝试测试一种方法。在这个方法中,实例化了一个新的对象,但我不想要它,否则会测试其他类。我如何告诉模仿者不要煽动它?
@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 类,然后在其中创建这个新对象 - 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);
现在你可以控制这个对象了。
推荐阅读
- sql-server-2008-r2 - 如何通过使用自连接(我认为是这样)而不使用子查询和嵌套来解决 sql server 中的这个查询?
- python - Python (matplotlib) 等效于 R (ggplot) 中的堆积条形图
- python - Django 模板 - 嵌套字典迭代
- javascript - 如何使用正则表达式定义从 -50 到 50 的范围
- python-3.x - 为什么它在这段代码中返回 5 而不是 3?
- python - 如何使用 QSqlQueryModel 获取具有给定变量名的数据?
- docker - 在 Docker 上使用 Nginx 重定向端口
- json - 如何分组?Django 休息框架
- oracle - 如何在同一重复记录上插入数据以及更新
- amazon-web-services - PowerShell 未执行 AWS CloudFormation