我有一个基本接口,另一个类正在实现。
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测试,以便Student接口的Mock类使用stubbed方法而不是StudentImpl中的方法。注入确实有效但我想使用amock类来模拟结果而不是为了测试。任何帮助将不胜感激。
答案 0 :(得分:6)
在我看来,单元测试中的自动装配是一个标志,它是一个集成测试,而不是单元测试,所以我更喜欢自己做“接线”,正如你所描述的那样。它可能需要您对代码进行一些重构,但这不应该是一个问题。在您的情况下,我会向InfoService
添加一个构造函数,以获得Student
实现。如果您愿意,还可以创建此构造函数@Autowired
,并从@Autowired
字段中删除student
。然后Spring仍然能够自动装配它,而且它也更容易测试。
@Service
public class InfoService {
Student student;
@Autowired
public InfoService(Student student) {
this.student = student;
}
}
然后,在您的测试中,在您的服务之间传递模拟将是微不足道的:
@Test
public void myTest() {
Student mockStudent = mock(Student.class);
InfoService service = new InfoService(mockStudent);
}