как сделать джунит-тест для вставки базы данных с помощью Hibernate - PullRequest
0 голосов
/ 20 марта 2019

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

Я прикрепил таблицу java, но значение, которое я вставляю с использованием файла теста, не отображается при отладке?

Sample.java

@Entity
public class Sample {

	@Id
	private int sid;
	private String name;
	public void set_sid(int sid)
	{
		this.sid=sid;
	}
	public void set_name(String name)
	{
		this.name=name;
	}
	public int get_sid()
	{
		return sid;
	}
	public String get_name()
	{
		return name;
	}
	
}
SampleInsert.java

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class SampleInsert {

	private Sample s;
	private static SessionFactory sf; 

	
	public void insert() {
		sf = new Configuration().configure(new File("C:/Users/ns068002/eclipse-workspace/JAXRS-HelloWorld1/src/main/java/com/javacodegeeks/enterprise/rest/jersey/hibernate.cfg.xml")).buildSessionFactory();
		Session session = sf.getCurrentSession();
        session.beginTransaction(); 
        Sample s=(Sample) session.get(Sample.class, 1);
        System.out.println(s+"2");
        System.out.println(s.get_name());
        session.getTransaction().commit();
	}
}
SampleInsertTest.java

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class SampleTest {

	Session session;
	SampleInsert st;
	
	@Before
	public void setUp() {

	  session=mock(Session.class);
		st=new SampleInsert();
	}
	
	@Test
	public void test() {
		Sample s=new Sample();
		s.set_sid(1);
		s.set_name("gopal");
		Mockito.when(session.get(Sample.class,1)).thenReturn(s);
		System.out.println(s+"1");
		st.insert();
	}

}

1 Ответ

0 голосов
/ 21 марта 2019

Глядя на ваш код, я не могу понять, как вы могли бы смоделировать / заглушить Session или SessionFactory, поскольку ни одна из этих вещей не «внедряется» в класс SampleInsert.

Под «введенным» я подразумеваю, что значения не передаются в класс каким-либо образом, обычно это делается с помощью аннотации с такой средой, как Spring, или с помощью конструкторов.

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

В качестве примера того, как вы можете использовать Mockito:

public interface SomethingToMock {
   int returnSomeValueFor(int value);
}

public class ToBeTested {
   private SomethingToMock session;

   public ToBeTested(SomethingToMock session) {
      this.session = session;
   }

   public void methodToTestA(int value) {
      returnSomeValueFor(value);
   }

   public int methodToTestB(int value) {
      int i = returnSomeValueFor(value);
      return i * i;
   }
}

@RunWith(MockitoJUnitRunner.class)
public class SomeTests {
   @Mock
   private SomethingToMock aMock;

   private ToBeTested underTest;

   @Before
   public void setUp() {
      underTest = new ToBeTested(aMock);
   }

   @Test
   public void testOne() {
      underTest.MethodToTestA(3);

      verify(aMock).returnSomeValueFor(3);
   }

   @Test
   public void testTwo() {
      when(aMock.returnSomeValueFor(3)).thenReturn(2);

      int r = underTest.methodToTestB(3);

      assertEqual(r, 4);
   }
}

В приведенном выше примере мы создаем интерфейс, который представляет собой объект, который нужно смоделировать, мы должны стремиться только к тому, чтобы смоделировать интерфейсы и только те, которые мы или наша команда создали.

Затем у нас есть класс, который нам нужно протестировать, который использует интерфейс ToBeTested, мы можем предположить, что конкретная реализация интерфейса тестируется в другом месте проекта. ToBeTested имеет два метода для тестирования, один из которых не имеет возврата, поэтому не имеет побочных эффектов, которые мы можем видеть. Второй метод выполняет некоторую обработку и имеет побочный эффект.

Затем мы создаем тестовый класс для тестирования обоих методов, мы гарантируем, что он настроен на использование Mockito (@RunWith(MockitoJUnitRunner.class), затем мы настраиваем макет с помощью @Mock, последний шаг установки - убедиться, что наш класс имеет макет " вводится "в него, это делается методом setUp().

Наконец, мы создаем два теста, первый из которых проверяет, что вызванный метод вызывается, нам не нужно устанавливать when для этого в этом случае, так как никакое значение не будет возвращено из метода, который мы тестируем, только из Я считаю, что метод Mockito вернет значение по умолчанию для int.

Второй тест проверяет, что значение возвращено, поэтому мы устанавливаем when, когда проверяемый метод вызывается способом, указанным в when, возвращается заданное значение, и мы можем утверждать, что правильное значение возвращается из тестируемого метода, в этом случае с использованием assertThat

Это общая схема тестирования с помощью Mockito. Эффективное тестирование - огромная тема, я бы посоветовал вам сделать некоторые исследования в Интернете Документы Mockito и JUnit очень хороши, и, конечно, у GitHub есть много проектов, использующих оба; одна из идей может состоять в том, чтобы взглянуть на Mockito и Unit на Github и посмотреть на их тестирование.

Также документация Mockito очень хорошо объясняет, как, почему и когда использовать насмешку: http://static.javadoc.io/org.mockito/mockito-core/2.25.1/org/mockito/Mockito.html

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...