当前位置: 首页 > 知识库问答 >
问题:

Mock属性值驻留在构造函数中,并在使用@injectbean注释时添加该Mock

裴理
2023-03-14
public class Demo() {
   private final Repository repository;
   private final long attr;

   public Demo(Repository repository) {
     this.repository = repository;
     this.attr = this.getValue();
   }
  
   private Long getValue() {
     return repository.getValue();
   }
   ... Rest of the code
}
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class DemoTest() {
  @Mock
  private Repository repository;

  @InjectMocks
  private Demo demo;

  @BeforeEach
  void setUp() {
    registrationUtil = new RegistrationUtil();
    MockitoAnnotations.initMocks(this);

}

共有1个答案

史默
2023-03-14

InjectMocks无法工作的原因可能是因为您的存储库字段是final。

请参见参考:Mockito注入不适用于构造器和setter模拟

决议:

import com.example.mongodb.embedded.demo.repository.UserRepository;

public class Demo {

    private final UserRepository repository;

    public Demo(UserRepository repository) {
        this.repository = repository;
    }

    private Long getValue() {
        return repository.count();
    }

    public String toString(){
        return "Count: " + getValue();
    }
}
package com.example.demo;

import com.example.mongodb.embedded.demo.repository.UserRepository;
import com.example.mongodb.embedded.demo.service.Demo;

import org.junit.Rule;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
class DemoApplicationTest {

    @Mock
    private UserRepository userRepository;

    Demo noneAutoWiredDemoInstance;

    @Test
    public void testConstructorCreation() {

        MockitoAnnotations.initMocks(this);
        Mockito.when(userRepository.count()).thenReturn(0L);

        noneAutoWiredDemoInstance = new Demo(userRepository);

        Assertions.assertEquals("Count: 0", noneAutoWiredDemoInstance.toString());
    }
}
 类似资料:
  • 问题内容: 在Jackson中,当您使用注释构造函数时,必须使用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。

  • 我正在构建一个API并使用swagger测试endpoint。我有一个产品: 在这个DTO中,我想使用在我的代码中使用的Price类。价格类如下所示: 但是由于私有设置器在类中使用,我无法使用swagger设置这些值(它在这些上具有属性)。我真的很喜欢这种拥有私有设置器并使用构造函数设置值的方法,顺便说一句,这是公共的。有没有办法我可以使用swagger为类设置值,并且仍然在属性上使用私有设置器?

  • 我在我的一个项目中有这个注释类。 注释类由我定义。 问题:我可以代替String使用一些属性 ,其值在编译时未知,但仅在运行时未知吗? 作为参考,这里是我的注释类型的定义。

  • 问题内容: 这是我想在属性文件中执行的操作 现在我能处理的文件是 有什么办法做这样的事情 问题答案: 您可以使用Apache的共享配置写入和读取属性的文件,特别是setComment()函数中的PropertiesConfigurationLayout它允许您指定每个属性的注释。 请注意,上述链接是指Commons Configuration v1.x,而同时发布了v2.0,它具有不同的程序包名称

  • 问题内容: 在Jackson中,当用注释构造函数时,必须用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。

  • 问题内容: 我的spring bean具有一个带有唯一强制性参数的构造函数,我设法用xml配置对其进行了初始化: 然后,我像这样使用此bean,并且效果很好。 但是我想用注释指定contructor arg值,例如 这可能吗 ? 提前致谢 问题答案: 首先,必须在bean定义中而不是在注入点中指定构造函数arg。然后,你可以利用spring的注释(spring 3.0) 就我所看到的问题而言,这可