Создание макета с Jmock для возврата нулевого значения для себя - PullRequest
1 голос
/ 10 мая 2009

У меня есть метод, который выглядит примерно так:

public void myMethod(MyClass c)
{
  if (c == null)
  {
    return;
  }
  try
  {
    c.someMethod();
  }
  catch (SomeException e)
  {
    // log the exception, possibly re-throw
  }
}

Я пытаюсь найти способ установить фиктивный экземпляр параметра MyClass c так, чтобы он возвращал для себя значение null, и чтобы c.someMethod () никогда не вызывался. Мой юнит тест выглядит так:

@Test
public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
    Mockery mockery = new Mockery()
    {{
            setImposteriser(ClassImposteriser.INSTANCE);
    }};

    final MyClass mockMyClass = mockery.mock(MyClass.class);

    try
    {
        mockery.checking(new Expectations()
        {{
            oneOf(mockMyClass).equals(null);
                will(returnValue(true));

            never(mockMyClass).someMethod();
        }});
    }
    catch (Exception e)
    {
        logger.fatal(e);
        fail("Exception thrown in test.");
    }
    Util.myMethod(mockMyClass);
}

По сути, я устанавливаю фиктивный экземпляр MyClass и устанавливаю для него ожидания, что, когда его значение будет проверено по отношению к нулевому значению, оно вернет true и что метод someMethod () никогда не вызывается. 1007 *

В данный момент тест не пройден, так как jMock говорит, что невозможно переопределить методы, предоставляемые классом Object (равная (нулевая) часть).

Есть ли способ сделать это с помощью jMock? Имеет ли этот шаблон смысл? Это действительный тест? Если нет, есть ли у кого-нибудь предложения о том, как это проверить?

Ответы [ 2 ]

3 голосов
/ 10 мая 2009

Я не думаю, что вы можете протестировать этот код, используя только JMock.

Я бы проверил это, передав null напрямую. Если не было сгенерировано или зарегистрировано никаких исключений, вы знаете, что ваш код работал должным образом. @ Test

public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
    Util.myMethod(null);
    //no exception should be thrown.
}

Если вы хотите сделать его более явным, вы можете заключить вызов myMethod(null) в блок try / catch, но в этом нет необходимости, кроме как для выяснения причины сбоя в случае сбоя.

public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
    try
    {
        Util.myMethod(null);
    }
    catch( ExpectedException e )
    {
        fail( "Should not have thrown exception: " + e.getMessage() ); 
    }
}

Это достаточный тест, потому что вы знаете, что если c равно null, то, конечно, c.something() не может быть вызвано.

1 голос
/ 21 мая 2009

Предполагается, что макеты используются для проверки того, как объект взаимодействует со своими соавторами. Если коллаборациониста нет, то не над чем издеваться. Передача в ноль проще и выразительнее.

...