【问题标题】:mock objects null for spring service class unit test春季服务类单元测试的模拟对象为空
【发布时间】:2020-07-20 18:22:13
【问题描述】:

我有多个构造函数的 Spring Service 类:

@Service("async")
public class AsyncProcessor extends Processor {


    private final JobRunner JobRunner;

    private final ExecutorService executorService;

    @Autowired
    public AsyncProcessor(final MyRepo MyRepo,
                              final JobRunner JobRunner) {
        this(MyRepo, JobRunner, 1, 1, 60);
    }

    public AsyncProcessor(final MyRepo MyRepo,
                              final JobRunner JobRunner,
                              @Value("${processor.corePoolSize:1}") final int corePoolSize,
                              @Value("${processor.maxPoolSize:1}") final int maxPoolSize,
                              @Value("${processor.keepAliveTime:60}") final int keepAliveTime) {
        super(MyRepo);
        this.JobRunner = JobRunner;
        this.executorService = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, SECONDS, new LinkedBlockingQueue<>());
    }
    
}

我正在使用 Junit 5 使用模拟依赖项创建服务测试,但出现了我无法解决的错误:

这是我的测试课:

@ExtendWith(MockitoExtension.class)
public class MyTest {

    @Mock
    private MyRepo repo;

    @Mock
    private JobRunner jobRunner;

    @Mock
    private ExecutorService executorServiceMock;

    @InjectMocks
    private AsyncProcessor processor = new AsyncProcessor(repo, jobRunner);

    @Test
    public void shouldSubmitTaskOnExecutor() {

    }
    
}

我在模拟的 repo 和 job runner 字段上得到空值,不知道为什么。 当我使用额外的 spring 属性参数添加第二个构造函数时,问题就开始了。

有什么想法吗?

【问题讨论】:

  • 您不应该将new@InjectMocks 分开吗? (我不熟悉基于注释的模拟实例化;我避免使用魔法外部集成,特别是因为这样的奇怪问题,我更喜欢直接调用 mock。)
  • 无论哪种方式,结果都是一样的。因为有多个构造函数,所以我用的是new。
  • 其实你是对的,没有注释它不会跳闸。

标签: java spring spring-boot junit mockito


【解决方案1】:

我认为新的关键字把事情搞砸了。创建一个 Spring @Configuration 类,该类具有一个 @Bean 注释方法,该方法返回从新添加的构造函数生成的异步处理器。然后,您的测试可以自动装配它,而无需调用构造函数。

【讨论】:

  • 这是一个通用模块项目,它被注入到其他项目中。基本上,这个想法是让其他项目能够使用他们自己的自定义池大小、超时等为执行程序服务创建这个bean,并调用第二个构造函数。他们还可以选择默认的第一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多