2016-04-13 1 views
0

В настоящее время я использую EasyMock и много пытаюсь исправить свою проблему.EasyMock - Mock класс, имеющий другие объекты класса и .class как параметры

Позвольте мне объяснить вам простыми словами: «Всего у меня 5 классов.

  • Main.java
  • A.java
  • B.java
  • C.java
  • Result.java

От Main.java я звоню метод A .java

objectOfA.someMethod("String",objectofB, C.class); 

While Mocking ...

expect(objectofA.someMethod("given some String", Prepared some dummy object of B and passing , C.class)).andReturn(objectofResult).anyTimes(); 

Пока я запускаю приложение, оно дает AssersionError.

Мои вопросы:

  1. В методе ожидать> при вызове objectofA.someMethod(), во втором параметре я создаю один фиктивный объект B, на самом деле B имеет около 10 переменных и среди них один будет генерироваться случайным образом, но при создании фиктивного объекта я даю некоторую ценность своей, будет ли это проблемой?

  2. 3-й параметр, мы должны передать C.class, как мы можем это передать?

  3. И наконец, в andReturn() Я передаю objectofResult класс, нужно ли в этом случае обработать фиктивный объект Result? потому что в Result.java у нас есть почти 20 переменных, и мне действительно трудно угадать значения.

В Result.java Мне просто нужно проверить значение переменной String.

Я пробую много с 3 дней, может кто-то помочь мне исправить это, пожалуйста.

ответ

2

Мы не можем сказать вам, что является «правильным» для вашего кода; потому что у нас нет полной картины (и вы не должны ожидать, что кто-то потратит свое время, чтобы погрузиться во весь ваш код, если бы вы разместили его).

Так, вопросы:

1) +2) Я думаю, вы получаете его назад. Дело в том, что вы сообщаете EasyMock о вызовах, которые должен выполнить ваш «код под тестированием».

Это означает: вы указываете EasyMock, что someMethod должен быть вызван; и EasyMock проверит, соответствует ли фактический вызов вашей спецификации.

Итак, это действительно зависит от вашей реализации вашего класса B. Если объект B, переданный вашим фактическим кодом с помощью someMethod(), равен , равный объекту B, который вы предоставляете на этапе EasyMock; чем все в порядке. Но если они не равны, то EasyMock будет жаловаться.Вы можете изменить это, например, с использованием matchers, как

EasyMock.expect(
    yourMock.someMethod(
    eq("string to match"), anyObject(B.class), ...) 

(где эк, anyObject быть статические методы в EasyMock).

Но проблема в том, что: если вы используете сокеты; вы должны использовать матчи на все свои аргументы. И (на данный момент); Я не знаю, что будет для класса «класс». Так, теперь я могу только посоветовать сделать что-то вроде:

EasyMock.expect(
    yourMock.someMethod("string to match", expectedB, C.class)) 

где «expectedB» является B объект, который вы установки заранее; так что он соответствует тому, что создается вашим тестируемым кодом. Чтобы попасть туда, вам нужно убедиться, что ваш класс B является «хорошим» методом equals().

3) Снова; вопрос, на что способен ваш «фиктивный результат»; зависит от того, как ваш тестовый код будет использовать его.

Пример: предположим, что ваш тестируемый код будет вызывать .toString() в этом объекте результата. Тогда вы, возможно, захотите подготовиться к этому; например, путем создания этого объекта результата ... быть еще одним макетом; который ожидает вызовы toString().

Короче говоря: вы используете EasyMock, чтобы указать все, что вы ожидаете «выйти» вашего тестируемого класса; и контролировать все, что «втекает» в испытуемый класс.

+0

Спасибо за ваш отзыв friend..I попытался внести изменения, как вы предложили .. и при изменении третьего параметра notNull (C.class) его отображение ... Тип несоответствия: невозможно преобразовать из C в класс Ошибка. – Bharath

+0

Да, вы правы; notNull (класс ) вернет T ... не T.class. Я уточню свой ответ на это. И по крайней мере сейчас: я тоже потерялся. Не уверен, если/как соответствовать определенному классу. – GhostCat

+0

На самом деле я подготовил ожидаемый объект B, потому что у меня есть поле под названием reqId, это будет генерироваться случайным образом для каждого нового запроса. Но в моем созданном ожидаемом объекте B я дал некоторую ценность своей, поскольку reqId будет генерироваться rendomly, я не могу соответствовать ожидаемому B с исходным (который будет создан во время запуска приложения). – Bharath

Смежные вопросы