Mockito:注入了没有注入其他课程的模拟课程

时间:2016-10-24 14:45:59

标签: java spring unit-testing mocking mockito

所以我有一个简单的java类:

@Component
public class IWantToTestThisClass {

@Autowired
private ClassA classA;

@Autowired 
private ClassB classB;

public ObjectA doIt(...) {
   classB.returnObject();
}

ClassA包含:

@Component
public class ClassA { 

@Autowired 
private ClassB classB;

public ObjectA doIt() {
   classB.returnObject(...);
}

ClassB的:

@Component
public class ClassB { 

public ObjectA returnObject(...) {
   ...
}

我的测试设置如下:

@InjectMocks
private IWantToTestThisClass iWantToTestThisClass;

@Mock
private ClassA classA;

@Mock
private ClassB classB;

@Before
public void setUp() {
    initMocks(this);

    when(classA.doSmt()).thenCallRealMethod();
    when(classB.doSmt()).thenCallRealMethod();
}

问题是ClassB没有注入ClassA。

然后通过classA调用returnObject(ClassB),它返回NullPointerException(ClassB不被模拟/注入)。

如果通过IWantToTestThisClass调用returnObject(classB),那就没关系。

这是同时为两个类注入ClassB的方法吗?我想称实际方法,而不是模拟方法。

2 个答案:

答案 0 :(得分:0)

您将模拟注入IWantToTestThisClass,而不是注入ClassA。所以没有模拟到ClassA,B没有注入那里。

尝试在classA

之前添加@InjectMocks

或者你可以这样做:

Button

如果将setter setClassB(...)添加到ClassA

答案 1 :(得分:0)

@Autowired可以由构造函数注入替换。因此,您的classA将是:

def merge(c,b,m,e):

    i = b,j = m+1
    l=[]
    while (i<=m) and (j<=e):
        if (c[i] < c[j]):
            l.append(c[i])
        else:
            l.append(c[j])
    if (i<=m):
        while (i<=m):
            l.append(c[i])
    else:
        while(j<=e):
            l.append(c[j])

    for i1 in l:
        print(l[i1])

def merge_sort(collection,beg,end):


    if(beg<end):
        mid=(beg+end)//2
        merge_sort(collection,beg,mid)
        merge_sort(collection,mid+1,end)
        merge(collection,beg,mid,end)
        #return collection



if __name__ == '__main__':


    user_input = input('Enter numbers separated by a comma:\n').strip()

    unsorted = [int(i) for i in user_input.split(',')]
    l = len (unsorted)

    merge_sort(unsorted,0,l)

通过这种方式,您可以稍后在@Before setUp方法中注入classB模拟:

@Component
public class ClassA { 

    private static ClassB classB;

    public ClassA(ClassB classB){
        this.classB=classB;
    }

    public ObjectA doIt() {
       classB.returnObject(...);
    }
}