【问题标题】:Problems with dependency injection using Mockito使用 Mockito 的依赖注入问题
【发布时间】:2020-02-01 20:39:40
【问题描述】:

我正在尝试将依赖项注入我的班级。但是由于某种原因,当我使用 Mockito 对其进行测试时,它不起作用,并且该对象未实例化并保持为空。

@Data
@Component
@ConfigurationProperties(prefix="docusign")
public class DocuSignProperties {

private String oAuthBaseUrl;
private String baseUrl;
}

在 application.properties 中:

#docuSign properties
docusign.oAuthBaseUrl=https://account-d.docusign.com/oauth
docusign.baseUrl=https://demo.docusign.net/restapi

注入DocuSignProperties的类:

@Component
public class DocuSign {
    @Autowired
    private DocuSignProperties docuSignProperties;

    private ApiClient apiClient;
    private OAuthToken oAuthToken;
    private UserInfo userInfo;

    public DocuSign() {
        this.initialize();
}

    public DocuSign(ProjetoDTO projeto)  {
        this.projeto = projeto;
        this.initialize();
}

    private void initialize() {
    try {
        this.apiClient = new ApiClient(this.docuSignProperties.getBaseUrl()); //here docuSignProperties is null, when should it be instantiated
        this.oAuthToken = getOAuthTokenAcesso();
        this.setApiClientConfigurations();
    }catch (Exception e) {
        LOGGER.error(e.getMessage());
        e.printStackTrace();
    }
}

测试它的类:

public class DocuSignTest {
    private DocuSignProperties docuSignProperties;
    private ProjetoDTO projeto1;
    @Mock
    private DocuSignProperties docuSignProperties;

    @Before
    public void setup() throws IOException {
       projeto1 = new ProjetoDTO();
       projeto1.setId(1L);
       projeto1.setDsProjeto("projeto1")
    }
  @Test
  public void criarDocumento() throws Exception {
      DocuSign docuSign = new DocuSign(projeto1);
      docuSign.sendDoc();
      assertNotNull(docuSign);
}

我想知道为什么初始化方法 docuSignProperties 没有实例化。

【问题讨论】:

  • 在@before你使用initMocks()
  • 不是很相关,但可以提供帮助。现场注入是一种隐藏。如果您使用构造函数注入,那么一切都将一目了然。这也适用于测试和生产代码。
  • MockitoAnnotations.initMocks(this); ?它没有工作;(
  • 当你不告诉他这样做时,mockito 应该如何知道将你的模拟注入到DocuSign 中?
  • @oitathi 你部分错了。这告诉 Mockito 模拟那个类,但没有告诉它把它注入DocuSign。您应该考虑从 Field Injection 切换到 Compiler Injection,例如 Michael Michailidis,然后模拟和测试类缺失的“组合”将变得显而易见。

标签: java spring dependency-injection mockito


【解决方案1】:

使用注释模拟你必须使用:

 MockitoAnnotations.initMocks(this);

或者在类的开头添加:

@RunWith(org.mockito.runners.MockitoJUnitRunner.class)

此外,你必须注入你的模拟,你可以使用我不推荐的@InjectMocks,但更改你的构造函数或使用设置器,这取决于该类是强制性的还是可选的:

 @Autowired
 public DocuSign(DocuSignProperties docuSignProperties) {
    this.initialize();
    this.docuSignProperties=docuSignProperties;
 }

然后在创建 DocuSign 时的测试中,您只需将 prodSignProj(您的模拟)作为参数传递

【讨论】:

    【解决方案2】:

    我把constructor改成

    public DocuSign(DocuSignProperties docuSignProperties) {
        this.initialize(docuSignProperties);
    }
    
    public DocuSign(ProjetoDTO projeto, DocuSignProperties docuSignProperties)  {
        this.projeto = projeto;
        this.initialize(docuSignProperties);
    }
    
    private void initialize(DocuSignProperties docuSignProperties) {...}
    

    在我的测试课上:

    @Before
    public void setup() throws IOException {
       docuSignProperties = new DocuSignProperties();
       docuSignProperties.setBaseUrl("https://demo.docusign.net/restapi");
       docuSignProperties.setBasePath("/restapi");
    
    @Test
    public void criarDocumento() throws Exception {
        DocuSign docuSign = new DocuSign (projeto1, docuSignProperties);
        docuSign.sendDoc();
        assertNotNull(docuSign);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-21
      • 2016-05-18
      • 1970-01-01
      • 2014-12-27
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多