如何使用@Resource对布尔字段进行单元测试

时间:2018-05-16 02:44:01

标签: java unit-testing mockito testng

我想测试一些类。这个类有@ Resource的布尔字段。我不能模拟这个字段。因此它给测试失败了一些错误。如果有人能告诉我如何测试这个类。

这是我的java类

public class RefreshHandlerImpl implements RefreshHandler
{
  @Resource(name = "readOnlyMode")
  private Boolean readOnlyMode;


  @Override
  public ContactBedRefreshResult refreshContactsAndBeds(final Unit unit, final boolean hasWritableTransaction)
throws RequiresWritableTransactionException
  {

    if (!isReadOnlyMode())
    {
      //some code here
    }

  }



  private boolean isReadOnlyMode()
  {
    return readOnlyMode;
  }

}

我尝试模拟" readOnlyMode" field.But它给出错误。

  

org.mockito.exceptions.base.MockitoException:   不能mock / spy类java.lang.Boolean   Mockito不能嘲笑/间谍:      - 最后的课程      - 匿名课程      - 原始类型

这是我的测试类

public class RefreshHandlerImplTest
{

 @Mock(name = "readOnlyMode")
 private Boolean readOnlyMode;

 @InjectMocks
 private RefreshHandlerImpl refreshHandlerImpl;

 @BeforeMethod
 public void setUp() throws Exception {
   initMocks(this);
 }

 @Test
 public void testRefreshContactsAndBeds_ReturnsZeroContactsWhenCollaboratorsDoes()
  throws Exception
 {
   ContactBedRefreshResult result = refreshHandlerImpl.refreshContactsAndBeds(unit, true);
   assertThat(result.getContacts()).isEmpty();
 }
}

我可以使用反射,然后使用它吗?我无法更改我的java类。只能更改测试类。

1 个答案:

答案 0 :(得分:2)

我使用org.springframework.test.util.ReflectionTestUtils修复了这个问题

我删除了@Mock(name = "readOnlyMode") private Boolean readOnlyMode; 并在我的@BeforeMethod方法中使用ReflectionTestUtils.setField(refreshHandlerImpl,RefreshHandlerImpl.class,"readOnlyMode",true,Boolean.class);。这是我的测试类,

public class RefreshHandlerImplTest
{
 @InjectMocks
 private RefreshHandlerImpl refreshHandlerImpl;

 @BeforeMethod
 public void setUp() throws Exception {
  initMocks(this);
  ReflectionTestUtils.setField(refreshHandlerImpl,RefreshHandlerImpl.class,"readOnlyMode",true,Boolean.class);
 }

 @Test
 public void testRefreshContactsAndBeds_ReturnsZeroContactsWhenCollaboratorsDoes() throws Exception
 {
   ContactBedRefreshResult result = 
   refreshHandlerImpl.refreshContactsAndBeds(unit, true);
   assertThat(result.getContacts()).isEmpty();
 }
}