mock contextloader.getcurrentwebapplicationcontext()我该怎么做?

ilmyapht  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(365)

我试图在使用mockito时模拟contextloader.getcurrentwebapplicationcontext()调用,但它无法模拟。

//here is my source code            
  @Mock
  org.springframework.web.context.WebApplicationContext webApplicationContext;

//test Case Body
 try (MockedStatic<ContextLoader> dummy = Mockito.mockStatic(ContextLoader.class)) {

AnswerInfo answerInfo = Mockito.mock(AnswerInfo.class);

TranDescScoreInfo descScoreInfo2 = Mockito.mock(TranDescScoreInfo.class);

when(ctx.getBean("answerInfo")).thenReturn(answerInfo);
when(ctx.getBean("tranDescScoreInfo")).thenReturn(descScoreInfo2);

dummy.when(() -> ContextLoader.getCurrentWebApplicationContext()).thenReturn(webApplicationContext);

//ContextLoader.getCurrentWebApplicationContext() getting null I dont why it getting null.

        }

//Below Code is my business logic  
 ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext();
 AnswerInfo answerInfo = (AnswerInfo) ctx.getBean("answerInfo");
 tranDescScoreInfo = (TranDescScoreInfo) ctx.getBean("tranDescScoreInfo");

//getbean获取null是因为我没有得到预期的模拟调用注意:我不想更改我的业务逻辑

f3temu5u

f3temu5u1#

你必须把代码移到try里面。我希望这对你有用:

class UserTest {
    @Mock
    WebApplicationContext webApplicationContext;

    @BeforeEach
     void setUp() throws Exception {
        MockitoAnnotations.openMocks(this);
    }

    @Test
     void test() {

//test Case Body
        try (MockedStatic<ContextLoader> dummy = Mockito.mockStatic(ContextLoader.class)) {
            Mockito.when(webApplicationContext.getBean("answerInfo")).thenReturn(new String());
            dummy.when(ContextLoader::getCurrentWebApplicationContext).thenReturn(webApplicationContext);
            //Below Code is my business logic
            ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext();
            assertNotNull( ctx.getBean("answerInfo"));
        }
    }
}
cgyqldqp

cgyqldqp2#

I tried this after some RnD it's working for me 
The below code is worked for me:

@Mock
static ServletContext servletContext;

@Mock
ContextLoader contextLoader;

@Mock
org.springframework.web.context.WebApplicationContext webApplicationContext;

@Mock
HttpServletRequest request;

private AutoCloseable closeable;

@BeforeAll
static void setUpBeforeClass() throws Exception {
    MockServletContext msc = new MockServletContext();
    msc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, "/test/config/spring/SpringBeansTest.xml");

    ServletContextListener listener = new ContextLoaderListener();
    ServletContextEvent event = new ServletContextEvent(msc);
    listener.contextInitialized(event);
}

@AfterAll
static void tearDownAfterClass() throws Exception {

}

@BeforeEach
void setUp() throws Exception {

    closeable = MockitoAnnotations.openMocks(this);

    Mockito.doReturn(Random.class).when(ctx).getBean(Mockito.anyString());

    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
}

@AfterEach
void tearDown() throws Exception {
    closeable.close();
    closeable = null;
}
//test case body
try (MockedStatic<ContextLoader> dummy = Mockito.mockStatic(ContextLoader.class)) {
dummy.when(() -> ContextLoader.getCurrentWebApplicationContext()).thenReturn(webApplicationContext);
}

相关问题