2016-03-11 5 views
0

Если у меня есть следующее;Jmockit @ Замещено внутри вспомогательного класса не инициализируется

public class ClassA { 

    public void methodA(){ 
    System.out.println("In ClassA, methodA"); 
    } 
} 
public class ClassB { 

    public void methodB(){ 
    } 
} 

и тест юнита;

@Test 
public void testMocked(@Mocked final ClassB mockedB) { 
    System.out.println("Mocked inline"); 
    new MockUp<ClassA>() { 
     @Mock 
     public void methodA() { 
      System.out.println("Inline mockup, mockedB:" + mockedB); 
     } 
    }; 
    ClassA a = new ClassA(); 
    a.methodA(); 

} 

Затем, когда я запускаю тест, я получаю;

Mocked inline 
Inline mockup, mockedB:[email protected] 

Как и ожидалось, класс B является посмешищем и доступен экземпляр.

Но, если я изменить это, чтобы создать вспомогательный класс для насмешливый,

public class MockHelper { 
    @Mocked ClassB classB; 
    public void setupMocks(){ 

    new MockUp<ClassA>() { 

     @Mock 
     public void methodA(){ 
      System.out.println("In setupMocks, classB:"+classB); 
     } 
    }; 
    } 
} 

и JUnit становится;

@Test 
public void testMockedInClass() { 
    System.out.println("Mocked in helper class"); 
    MockHelper mh = new MockHelper(); 
    mh.setupMocks(); 
    ClassA a = new ClassA(); 
    a.methodA(); 

} 

В результате я получаю;

Mocked in helper class 
In setupMocks, classB:null 

ClassB не инициализируется @Mocked внутри MockHelper

Я хотел бы, чтобы все насмешки в вспомогательном классе, вместо того, чтобы объявить все насмешки в тестовом классе. Любые идеи, почему это не работает? Спасибо.

+0

Какая польза от этого? –

+0

У меня есть много тестов для написания, и все они должны настроить макеты таким же образом. Ввод всех настроек в один класс позволит сэкономить много дублирующегося кода. –

+1

Не дублирует насмешливые классы. Вы должны иметь возможность использовать наследование. Пусть каждый класс, которому нужны общие mocks, расширяет ваш вспомогательный класс –

ответ

0

Спасибо Dom Farr, ответ был наследованием.

public class MockHelper { 

@Mocked 
ClassB classB; 

public void setupMocks() { 

    new MockUp<ClassA>() { 

     @Mock 
     public void methodA() { 
      System.out.println("In setupMocks, classB:" + classB); 
     } 
    }; 
} 
} 

и общественного класса mockTest расширяет MockHelper {

@Test 
public void testMockedInClass() { 
    System.out.println("Mocked in helper class"); 
    setupMocks(); 
    ClassA a = new ClassA(); 
    a.methodA(); 

} 

} 

Поскольку тестовый класс расширяет помощник, теперь он работает;

Mocked in helper class 
In setupMocks, classB:[email protected]