如何为从属性文件中读取属性的方法编写Mockito + Junit测试用例

时间:2017-06-01 06:55:12

标签: spring-mvc mockito junit4

我必须为方法编写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();

   }
 }

1 个答案:

答案 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;
  ...
}