2016-10-07 3 views
0

У меня есть класс java, который вызывает метод через отражение. Этот метод создает соединение с базой данных и выполняет операции с базой данных. Я хочу проверить свой код отражений с помощью junit. Есть ли способ сделать это?Как проверить код Java-отражений с помощью JUnit

Подпишитесь ниже.

Class DaoImpl { 

    public void setResult(String result) { 
     this.result = result 
    } 

    public String getResult() { 
     return this.result; 
    } 

    public void doDBoperation() { 
     Connection connection = getConnection(); 
     Statement st = connection.createStatement(); 
     ResultSet rs = st.executeQuery("Select column_name from table"); 
     if(rs.next()) { 
      result = "value"; 
     } 
    } 
} 


Class ReflectionClass { 

    public void invoke() { 
     Class<?> noParam = {}; 

     Class<?> clazz = Class.forname("DaoImpl"); 
     Method method = clazz.getDeclaredMethod("doDBoperation", noParam); 

     method.invoke(clazz.getNewInstance); 
     System.out.println("This is it"); 
    } 
} 

Как написать тестовый пример JUnit для моего ReflectionClass?

+0

Не могли бы вы исправить ошибки компиляции в фрагментах кода в первую очередь? –

+0

фрагмент кода - всего лишь макет кода. – rDX

+0

Проводка правильного кода увеличит вероятность получения ответа. –

ответ

0

Не существует реального теста «чистого измерения единицы измерения» * ReflectionClass **. Обычно вы выполняете единичный тест, предоставляя посмеянный экземпляр этого класса для вашего производственного кода; то вы можете использовать фальшивую фреймворк, чтобы проверить, вызван ли ожидаемый метод.

Но в вашем случае вы создали код, который просто жесткий для проверки (если вы хотите узнать, как обращаться с этой частью, вы можете посмотреть эти videos). Вы в основном называете «новый» непосредственно в своем производственном коде; таким образом, нет способа вставить издеваемый объект. И кроме того, вы также не можете издеваться над этими методами отражения.

Единственный вариант для , возможно,, этот код будет проверен на использование Mokito вместе с PowerMock. Но я не специалист в этой области и не могу пообещать вам, что он сработает.

Моя рекомендация вам: отступить назад и цифра, если вы можете получить от использования отражения или, по крайней мере: отделить внимание здесь. Потому что как сказано: ваш производственный проект выглядит weird; и вместо того, чтобы тратить часы, чтобы получить что-то модульное тестирование; вы должны потратить часть этого времени, чтобы улучшить свой дизайн! «Трудно проверить», как правило, означает, что «дизайн может быть улучшен»!

Значение: сначала вы создаете интерфейс , который обозначает функцию, которую вы хотите протестировать. Затем отделить производство код ReflctionClass, как:

  1. Одна часть отвечает за экземпляр этого интерфейса (и этот код может использовать отражение делать свою работу, если это действительно требуется)
  2. Другая часть затем вызывает метод (ы), который вы хотите вызвать в этом объекте интерфейса.

Таким образом, вы получаете две части, которые вы можете тестировать независимо друг от друга!

Edit: то, что я имею в виду «плохой дизайн» - почему вы с помощью отражения, чтобы сделать оба - создания объекта и вызов метода? Понимаете, вы могли бы просто передать этот созданный объект в его правильный класс (по крайней мере, если у вас есть интерфейс, определенный там), а затем выполнить обычный вызов метода на этом типизированном объекте.

0

Как предложено @GhostCat PowerMockito может использоваться, чтобы попытаться высмеять конструктор DaoImpl.Вот код:

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mockito; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ReflectionClass.class) 
public class ReflectionClassTest { 

    @Test 
    public void invoke() throws Exception { 

    DaoImpl mockedDaoImpl = PowerMockito.mock(DaoImpl.class); 
    PowerMockito.whenNew(DaoImpl.class).withNoArguments().thenReturn(mockedDaoImpl); 
    new ReflectionClass().invoke(); 
    Mockito.verify(mockedDaoImpl, Mockito.atLeastOnce()).doDBoperation(); 
    } 
} 

Но это не работает. PowerMock не может издеваться над конструктором при вызове посредством отражения.