Mockito NullPointerException

10
我遵循了 @hoaz 的建议,但是我得到了一个空指针异常。
@RunWith(MockitoJUnitRunner.class)
public class GeneralConfigServiceImplTest  {

@InjectMocks private GeneralConfigService generalConfigService;
@Mock private SomeDao someDao;
@Mock private ExternalDependencyClass externalDependencyObject 

@Test
public void testAddGeneralConfigCallDAOSuccess() {
    when(someDao.findMe(any(String.Class))).thenReturn(new ArrayList<String>(Arrays.asList("1234")));

    //println works here, I am able to get collection from my mocked DAO

    // Calling the actual service function
    generalConfigService.process(externalDependencyObject)
    }
}

我的代码是这样的:

import com.xyz.ExternalDependencyClass;

public class  GeneralConfigService{

private SomeDao someDao;

public void process(ExternalDependencyClass externalDependencyObject){

// function using Mockito 
Collection<String> result = someDao.findMe(externalDependencyObject.getId.toString())
    }
}

我还注意到DAO是null,所以我做了这个(只是为了提醒,我做下面的步骤尝试过,我知道springUnit和Mockito或xyz之间的区别):

我也注意到 DAO 是 null,所以我进行了以下操作(仅仅是为了说明一下,我做了下面这个步骤尝试过,我知道 Spring Unit 和 Mockito 或其他类库之间的区别):

@Autowired
private SomeDao someDao;


@John B的解决方案解决了我的问题。但我想提一下对我没有起作用的部分。这是我的更新后的单元测试。


@Test
public void testAddGeneralConfigCallDAOSuccess() {
    /*
    This does not work
    externalDependencyObject.setId(new ExternalKey("pk_1"));
    // verify statement works and I thought that the class in test when call the getId 
    // it will be able to get the ExternalKey object
    //verify(externalDependencyObject.setId(new ExternalKey("pk_1")));
    */

    // This works
    when(externalDependencyObject.getId()).thenReturn(new ExternalKey("pk_1"));
    when(someDao.findMe(any(String.Class))).thenReturn(new ArrayList<String>(Arrays.asList("1234")));

    ....
    // Calling the actual service function
    generalConfigService.process(externalDependencyObject)
    }


在以下问题中引用了本问题:

如何使用Mockito模拟外部方法调用?

如何使用Mockito在模拟对象上设置属性?


3
你为什么要嘲笑你正在自动装配的东西?这似乎应该是一个纯粹的Spring风格的集成测试或者纯粹的模拟测试。 - Makoto
我尝试进行@Autowired步骤,因为我遇到了NullPointer异常,但即使在那之后,它仍然遇到了异常。我发现当someDao.findMe(someObject.getId.toString())执行时,它不会触发我的MockDao返回语句,而是尝试评估someObject.getId.toString()。当我在someDao.findMe的测试中进行println时,确实返回了集合。我还检查了调试,someDao已经将属性设置为generalConfigService。所以不知道为什么它要进行评估而不仅仅返回我的集合。 - Anuj
1个回答

12

你没有模拟 externalDependencyObject 中的 getId 行为,因此它返回了 null,并在调用该 nulltoString() 时导致了 NPE。

你需要使用 when(externalDependencyObject.getId()).then...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接