【发布时间】: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