我必须为方法编写Mockito + Junit测试,该方法从属性文件中读取数据。当我尝试执行我的测试用例时,属性文件正在加载但它返回null。以下是我的代码:
@RestController
@PropertySource("classpath:/com/example/prop.properties")
public class ReadProp {
@Value("${name}")
private String name;
@Value("${rollNo}")
private String rollNo;
@RequestMapping(value="/")
public void getDetails(){
System.out.println(name);
System.out.println(rollNo);
}
}
The test case is as follows
@RunWith(MockitoJUnitRunner.class)
@PropertySource("classpath:/com/example/prop.properties")
public class ReadPropTest {
@Mock
private ReadProp readProp;
@Value("${name}")
private String name;
@Value("${rollNo}")
private String rollNo;
@Test
public void readValues() {
System.out.println(name);
System.out.println(rollNo);
readProp.getDetails();
}
}
答案 0 :(得分:0)
让我们从一开始就开始......你的考试有很多问题,首先是你实际上没有任何东西可以测试...
@Mock
private ReadProp readProp;
这与@RunWith(MockitoJUnitRunner.class)
一起使您的readProp
对象成为模拟对象。模拟对象不包含逻辑。除了方法名称等之外,它与原始ReadProp
类无关。但该方法本身并没有做任何事情(除非你告诉他们)。
所以,第一个问题:你没有测试你的RealProp
类,而是一个模拟对象,它没有帮助。你正在创建一个只看起来像RealProp
对象的东西然后你测试它,但当然,这并没有告诉你任何事情。模拟可以帮助您简化测试中的依赖性等 - 但实际测试模拟没有任何意义。
所以,不要。相反,请制作一个真实的RealProp
。
另一个问题是,System.out不是很好测试,但我认为这只是临时代码,所以让我们暂时忽略它......
接下来的问题是,你想测试什么?有两种可能性:
a)你想测试一下,假设你正在使用的依赖注入框架(在本例中为spring)正确填充字段名和rollNo,方法getDetails
将正确使用它们。
b)您希望测试值的注入是否有效以及方法getDetails
是否使用该值。
这是两个不同的测试。 a)将是一个真正的单元测试,因为它仅限于这个"单元"。 b)会更复杂,因为它不仅仅是看这个单元,而是它周围的Spring环境。我不会把它称为集成测试,但它不仅仅是一个简单的单元测试。
就个人而言,我尝试尽可能避免单元测试中的Spring环境,并专注于我自己的代码,稍后在真正的集成测试中测试Spring集成,但这与其他任何东西一样多的个人偏好
让我们从a)...
开始public class ReadPropTest {
private ReadProp readProp = new ReadProp();
@Before
public void init() {
Whitebox.setInternalState(readProp, "name", "someName");
Whitebox.setInternalState(readProp, "rollNo", "someRollNo");
}
@Test
public void myTest() {
...
}
}
当然,您也可以使用Spring的ReflectionTestUtils而不是Mockito的Whitebox,这并不重要。
对于b),你可以尝试这样的事情。当然,你需要稍微使用配置,因为它取决于你的设置。
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:applicationContext-spring.xml" })
public class ReadPropTest {
@Autowired
private ReadProp readProp;
...
}