【发布时间】:2017-05-31 11:07:39
【问题描述】:
我有Spring课说
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
class MainServiceImpl implements MainService {
private final InternalService internalService;
public Set<String> do(String anything) {
Set<String> relevent = internalService.finaIntern(anything);
return relevent;
}
}
我正在编写单元测试用例如下
@RunWith(MockitoJUnitRunner.class)
class TestMainServiceImpl {
@InjectMocks
private MainServiceImpl service;
@Mock
InternalService internalService;
@Before
public void init(){
MockitoAnnotations.initMocks(this);
}
@Test
public void testDo() {
Set<String> setData = new HashSet<>();
setData.add("ABC");
String a ="a";
when(internalService.finaIntern(any(String.class))
.thenReturn(setData);
Set<String> result = service.do(a);
assertTrue(!result.isEmpty());
}
}
这里我的测试用例失败了,但是如果我从 MainServiceImpl 中删除 final 并执行如下明确的 @Autowired
@Component
class MainServiceImpl implements MainService {
@Autowired
private InternalService internalService;
.....
在这里我很想知道 1.如果我删除final关键字,我的测试用例如何通过 2. 使用 @RequiredArgsConstructor 是否是一个好习惯,如果是,那么如何,如果不是,那么为什么?
提前致谢
【问题讨论】:
-
您的测试没有意义...您正在创建一个模拟并将其注入测试用例而不是
MainServiceImpl。所以要么你没有在使用时显示代码,要么你的代码真的很无聊。 -
@M.Deinum 由于安全原因我不能在这里发布实际代码,所以我输入了类似的类。这是一个拼写错误。我已经修改了它。
-
您还有一个双重初始化,您已经在使用
MockitoJUnitRunner运行,但再次在您的@before方法中初始化它们。你必须初始化它们(特别是由于你的最终成员)。 -
感谢@M.Deinum,当我删除@RunWith 注释时它工作正常,但是当有@RunWith 注释时它为什么不起作用。如果 JUnit 无法更改最终变量也没关系,但是它如何影响 when().thenReturn() ?
-
因为你现在正在告诉一个不同的模拟然后
MainServiceImpl有什么要做。你最终得到 2 个模拟(由于双重初始化,你最终得到 2 个模拟,并且由于final关键字,它们中只有一个连接到MainServiceImpl。所以要么删除@RunWith要么删除 @987654331 @@BEfore` 方法,你真的只希望这种情况发生一次。
标签: java spring mockito junit4 lombok