Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

четверг, 30 января 2014 г.

Хотелось выпендрится

Чем люблю проект выходного дня - тем, что тут я могу рефакторить без конца и придумывать новые комбинации строк кода, порой даже нелепые. Это все позволяет мне знать как можно, а как не стоит. Сейчас я предложу пример того как можно было бы, но не стоит :)

Пишу на ночь глядя эмулятор КР580ВМ80 - ну такое, just for fun. Конечно же по ТДД. Тесты рефакторю, как положено. И вот я в тесте пишу как-то так ассерт
    assertEquals("DEh", registry.m().toString());
При том, что
public class ProcessorTest {

    private Memory memory;
    private Processor processor;
    private Registry registry;

    @Before
    public void setup() {
        memory = mock(Memory.class);
        processor = new Processor(memory);
        registry = processor.registry();
    }
а интерфейс
public interface Registry {
    AByte b();
    AByte c();
    AByte d();
    AByte e();
    AByte h();
    AByte l();
    AByte m();
    AByte a();
}
а AByte содержит че-то умное и toString. Но мне хотелось выпендрится и сделать вот так в тесте, чтобы на at(). вываливались аутокомплитером IDE методы интерфейса Registry


Проверил, может ли такое Mockito. Оказалось может!
    private RegistryAssert assertValue(String data) {
        return new RegistryAssert(data);
    }
    
    class RegistryAssert {

        private String data;

        public RegistryAssert(String data) {
            this.data = data;
        }

        public Registry at() {
            // создаем шпиона для registry
            Registry spy = spy(registry); 
            // и следим за каждым его чихом
            setup(spy).b(); 
            setup(spy).c();
            setup(spy).d();
            setup(spy).e();
            setup(spy).h();
            setup(spy).l();
            setup(spy).m();
            setup(spy).a();
            return spy;
        }

        private Registry setup(Registry spy) {
            return doAnswer(new Answer<Object>() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    Object actual = invocation.callRealMethod();
                    assertEquals(data, actual.toString());
                    return actual;
                }
            }).when(spy);
        }
    }
Не делайте так ☺

Комментариев нет:

Отправить комментарий