在JUnit测试中使用带有依赖注入的Mock类



我有一个基本的接口,另一个类正在实现。

package info;
import org.springframework.stereotype.Service;
public interface Student 
{
    public String getStudentID();
}

package info;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class StudentImpl implements Student
{
    @Override
    public String getStudentID() 
    {
        return "Unimplemented";
    }
}
然后我有一个服务将这个类注入到 中
package info;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Service
public class InfoService {
    @Autowired
    Student student;
    public String runProg()
    {
            return student.getStudentID();
    }
}

我想知道的是,如何设置一个JUnit测试,以便学生接口的Mock类使用存根方法而不是StudentImpl中的方法进入。注入确实可以工作,但是为了测试,我想使用mock类来模拟结果。

在我看来,单元测试中的自动布线是一个标志,它是一个集成测试而不是单元测试,所以我更喜欢做我自己的"布线",正如你所描述的。这可能需要您对代码进行一些重构,但这不应该是一个问题。在您的情况下,我会向InfoService添加一个构造函数,以获得Student的实现。如果您愿意,还可以将此构造函数设置为@Autowired,并从student字段中删除@Autowired。Spring仍然可以自动装配它,而且它也更可测试。

@Service
public class InfoService {
    Student student;
    @Autowired
    public InfoService(Student student) {
        this.student = student;
    }
}

那么在测试中在服务之间传递mock就很简单了:

@Test
public void myTest() {
    Student mockStudent = mock(Student.class);
    InfoService service = new InfoService(mockStudent);
}

相关内容

  • 没有找到相关文章

最新更新