Java 构造函数中未使用注入的模拟行为

Java 构造函数中未使用注入的模拟行为,java,unit-testing,mockito,Java,Unit Testing,Mockito,使用Mockito注释(MockitoJUnitRunner.class,@InjectMocks和@Mock): 我在构造函数中使用注入的依赖项来测试目标类: public class TagRepository { private final Collection<Tag> tags; @Autowired public TagRepository(SetupDetails setupDetails) { this.tags = Arr

使用Mockito注释(
MockitoJUnitRunner.class
@InjectMocks
@Mock
):

我在构造函数中使用注入的依赖项来测试目标类:

public class TagRepository {

    private final Collection<Tag> tags;

    @Autowired
    public TagRepository(SetupDetails setupDetails) {
        this.tags = Arrays.asList(
                new Tag("name", setupDetails.getSourceId()),
                ...
        );
    ...
}
这是未按预期工作的。Mockito似乎只在调用
@InjectMocks TagRepository
构造函数后存根方法调用,导致返回
null
而不是
“1”


有没有办法在调用构造函数之前准备好存根(使用Mockito注释)?

我唯一能够解决这个问题的方法是尝试控制Mockito设置的顺序,这种情况下放弃Mockito注释:

public void setUp() {
    setupDetails = mock(SetupDetails.class);
    when(setupDetails.getDbId()).thenReturn("1");

    repository = new TagRepository(setupDetails);
}

事实上,情况就是这样,你的“变通”才是出路。
有些人会认为这是一种很好的做法,因为当您将更多的成员引入到被测试的类中时,您的测试将无法编译,因为您还将它们添加到构造函数中。

您试图使用注释来完成什么<代码>何时(setupDetails.getSourceId())。然后返回(“1”)?不,没有办法通过注释来实现这一点。但是,您仍然可以使用
@Mock
等,而不存在任何问题。我只是编辑了这个问题(希望如此),以澄清什么不起作用以及我想要完成什么。您的意思是将更多依赖项传递给构造函数?另外,也许你的评论可以是对“变通”答案的评论?是的,这就是我的意思。关于对解决问题答案的评论。。。嗯,我是新用户,还不能对别人的答案发表评论:)
when(setupDetails.getSourceId()).thenReturn("1");
public void setUp() {
    setupDetails = mock(SetupDetails.class);
    when(setupDetails.getDbId()).thenReturn("1");

    repository = new TagRepository(setupDetails);
}