2014-11-06 3 views
0

싱글 톤 인 Dao 클래스를 사용하고 있습니다.이 서비스 클래스에서이 DAO 클래스 인스턴스를 사용하고 있습니다. 단위 클래스 테스트를 원합니다. 나는 DAO 클래스를 조롱해야합니다. . EasyMock을 사용해 보았습니다.싱글 톤 인스턴스를 사용하여 클래스를 모의하는 법

@RunWith(PowerMockRunner.class) 

@PrepareForTest (MusicPlayerDaoImpl.class) 공용 클래스 MusicPlayerServiceTest {

private MusicPlayerDaoImpl dao; 
private MusicPlayerServiceImpl service; 

@Before 
public void setUp() throws SQLException{ 
    this.service = MusicPlayerServiceImpl.getInstance(); 
    suppressConstructor(MusicPlayerDaoImpl.class); 
    mockStatic(MusicPlayerDaoImpl.class); 
    this.dao = createMock(MusicPlayerDaoImpl.class); 
    this.service.setInstance(this.dao); 
    Song song = new Song(); 
    Album album = new Album(); 
    Genre genre = new Genre(); 
    album.setAlbumName("some album); 
    genre.setGenreName("some genre); 
    song.setTitle("title"); 
    song.setRating(4); 
    song.setAlbum(album); 
    song.setGenre(genre); 
    EasyMock.expect(this.dao.getSong("Bahara")).andReturn(song); 
    EasyMock.replay(this.dao); 
} 


@Test 
public void getSongTest() throws SQLException, IllegalStateException, SecurityException, SystemException { 



    String title = "title"; 

Song returnSong = this.service.getSong(title); 
assertTrue(returnSong.getTitle() == title);  

} 

}

내가 같은 오류가 무엇입니까 "에 java.lang.AssertionError : 예기치 않은 메서드 호출"

 java.lang.AssertionError: 
    Unexpected method call MusicPlayerDaoImpl.getSong("title"): 
    MusicPlayerDaoImpl.getSong("title"): expected: 1, actual: 2 
    at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44) 
    at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:94) 
    at org.easymock.internal.ClassProxyFactory$MockMethodInterceptor.intercept(ClassProxyFactory.java:97) 
    at service.MusicPlayerDaoImpl$$EnhancerByCGLIB$$e2ddeccf.getSong(<generated>) 
    at service.MusicPlayerServiceImpl.getSong(MusicPlayerServiceImpl.java:99) 
    at MusicPlayerServiceTest.getSongTest(MusicPlayerServiceTest.java:64) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310) 
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:88) 
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:96) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282) 
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86) 
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) 
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) 
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68) 

답변

1

ason 함수가 실제로 1보다 2 회 호출되는 것은 서비스가 실제로 어떻게 작동하는지에 달려 있습니다. 어쩌면 서비스가 DAO 방법을 두 번 이상 호출 할 수 있습니다. 당신이

assertEquals(expected, actual) 

또는 더 나은을 이용해야하는 위치 또한

, 당신은

assertTrue(expected == actual) 

을 사용하고 있습니다

assertThat(actual, is(expected))