0

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

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 类使用存根方法而不是 StudentImpl 中的方法介入。注入确实有效,但我想使用 amock 类来模拟结果,而不是为了测试。任何帮助将不胜感激。

4

1 回答 1

6

在我看来,单元测试中的自动装配表明它是一个集成测试而不是单元测试,所以我更喜欢像你描述的那样做我自己的“装配”。它可能需要您对代码进行一些重构,但这应该不是问题。在您的情况下,我会在InfoService该 get 的Student实现中添加一个构造函数。如果您愿意,您也可以创建此构造函数@Autowired,并@Autowiredstudent字段中删除 。然后 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);
}
于 2013-04-11T07:58:04.757 回答