пружинная 3 электропроводка и тестирование джунтов - PullRequest
44 голосов
/ 07 сентября 2010

Мой код:

@Component
public class A {
    @Autowired
    private B b;

    public void method() {}
}

public interface X {...}

@Component
public class B implements X {
    ...
}

Я хочу проверить в классе изоляции A. Должен ли я издеваться над классом B? Если да, то как? Потому что он подключен автоматически, и нет установщика, куда я мог бы отправить макет.

Ответы [ 4 ]

83 голосов
/ 08 сентября 2010

Я хочу проверить в классе изоляции A.

Вы должны абсолютно издеваться над B, а не создавать экземпляр и внедрять экземпляр B. Смысл в том, чтобы проверить A, работает ли B, или нет, поэтому вы не должны допускать, чтобы потенциально сломанный B мешал проверке A.

Тем не менее, я настоятельно рекомендую Mockito . Что касается насмешливых фреймворков, они чрезвычайно просты в использовании. Вы бы написали что-то вроде следующего:

@Test
public void testA() {
    A a = new A();
    B b = Mockito.mock(B.class); // create a mock of B
    Mockito.when(b.getMeaningOfLife()).thenReturn(42); // define mocked behavior of b
    ReflectionTestUtils.setField(a, "b", b); // inject b into the B attribute of A

    a.method();

    // call whatever asserts you need here
}
18 голосов
/ 23 июля 2012

Вот пример того, как мои тесты работают с Spring 3.1, JUnit 4.7 и Mockito 1.9:

FooService.java

public class FooService {
    @Autowired private FooDAO fooDAO;
    public Foo find(Long id) {
        return fooDAO.findById(id);
    }
}

FooDAO.java

public class FooDAO {
    public Foo findById(Long id) {
        /* implementation */
    }
}

FooServiceTest.java

@RunWith(MockitoJUnitRunner.class)
public class FooServiceTest {
    @Mock private FooDAO mockFooDAO;
    @InjectMocks private FooService fooService = new FooService();

    @Test public final void findAll() {
        Foo foo = new Foo(1L);
        when(mockFooDAO.findById(foo.getId()).thenReturn(foo);

        Foo found = fooService.findById(foo.getId());
        assertEquals(foo, found);
    }
}
15 голосов
/ 07 сентября 2010

Вы можете ввести поле с помощью отражения, используя Spring * * * * * (или расширение junit PrivateAccessor), или вы можете создать фиктивный контекст приложения и загрузить его.Хотя для простого юнит-теста (без интеграции) я предпочитаю использовать рефлексию для простоты.

0 голосов
/ 07 сентября 2010

Это обсуждение на форуме имеет смысл для меня.Вы можете объявить свой закрытый член b как тип InterfaceB, который реализуется классом B (то есть: сервис-ориентированный), а затем объявить, что класс MockB также реализует тот же интерфейс.В контексте приложения тестовой среды вы объявляете класс MockB и контекст производственного приложения, вы объявляете обычный класс B, и в любом случае код для класса A изменять не нужно, поскольку он будет автоматически подключен.

...