Cool! thanks for following up!
On Tue, Nov 28, 2017 at 1:29 AM, Mike Guo <[email protected]> wrote:
> Hi, All.
>
> I got this.
>
>
>
> just create a mock object.
> and then set the condition
>
>
> like when(testSubject.hasRole(“admin”).thenreturn(“true”)
>
>
>
>
> thanks
>
>
> Mike
>
>
>
>
>
> Hi,
>
> I got a question here:
>
>
> I got a project (spring mvc + shiro ), the project is work perfect, but
> I’d like write some testing code for this project. so I put spring-test
> framework into it.
>
> here’s my code and how to put them together
>
> first: the pom.xml
>
> <dependency>
> <groupId>org.springframework</groupId>
> <artifactId>spring-test</artifactId>
> <type>jar</type>
> <scope>test</scope>
> </dependency>
>
> <dependency>
> <groupId>junit</groupId>
> <artifactId>junit</artifactId>
> <version>${junit.version}</version>
> <scope>test</scope>
> </dependency>
>
> <dependency>
> <groupId>org.hamcrest</groupId>
> <artifactId>hamcrest-core</artifactId>
> <version>${hamcrest.core.version}</version>
> <scope>test</scope>
> </dependency>
> <dependency>
> <groupId>org.mockito</groupId>
> <artifactId>mockito-core</artifactId>
> <version>${mockito.core.version}</version>
> <scope>test</scope>
> </dependency>
>
>
>
> and then I found some little code from google. and make the testing
> configuration:
>
>
> public abstract class AbstractShiroTest {
>
>
> protected static ThreadState subjectThreadState;
>
> public AbstractShiroTest() {
> }
>
>
> protected void setSubject(Subject subject) {
> clearSubject();
> subjectThreadState = createThreadState(subject);
> subjectThreadState.bind();
> }
>
> protected Subject getSubject() {
> return SecurityUtils.getSubject();
> }
>
> protected ThreadState createThreadState(Subject subject) {
> return new SubjectThreadState(subject);
> }
>
> /**
> * Clears Shiro's thread state, ensuring the thread remains clean for
> future test execution.
> */
> protected void clearSubject() {
> doClearSubject();
> }
>
> private static void doClearSubject() {
> if (subjectThreadState != null) {
> subjectThreadState.clear();
> subjectThreadState = null;
> }
> }
>
> protected static void
> setSecurityManager(org.apache.shiro.mgt.SecurityManager
> securityManager) {
> SecurityUtils.setSecurityManager(securityManager);
> }
>
> protected static org.apache.shiro.mgt.SecurityManager
> getSecurityManager() {
> return SecurityUtils.getSecurityManager();
> }
>
> @AfterClass
> public static void tearDownShiro() {
> doClearSubject();
> try {
> org.apache.shiro.mgt.SecurityManager securityManager =
> getSecurityManager();
> LifecycleUtils.destroy(securityManager);
> } catch (UnavailableSecurityManagerException e) {
> //we don't care about this when cleaning up the test
> environment
> //(for example, maybe the subclass is a unit test and it
> didn't
> // need a SecurityManager instance because it was using only
> // mock Subject instances)
> }
> setSecurityManager(null);
> }
>
> }
>
>
>
>
>
>
> and then here’s the testing case class:
>
>
> @RunWith(SpringJUnit4ClassRunner.class)
> @WebAppConfiguration(value="src/main/webapp")
> @ContextHierarchy({
> @ContextConfiguration(name="root", classes=RootConfig.class),
> @ContextConfiguration(name="mvcconfig", classes=MvcConfig.class)
> })
>
> public class TestHomeController extends AbstractShiroTest {
>
>
>
>
>
> @Before
> public void setUp() throws Exception {
> mvc = MockMvcBuilders.webAppContextSetup(wc).build();
>
> SecurityManager securityManager = mock(SecurityManager.class,
> RETURNS_DEEP_STUBS);
> ThreadContext.bind(securityManager);
>
> testSubject = new Subject.Builder(getSecurityManager()).buildSubject();
> mockSession = new MockHttpSession(wc.getServletContext(), testSubject
> .getSession().getId().toString());
> setSubject(testSubject);
>
> UsernamePasswordToken token = new UsernamePasswordToken("admin", "123456"
> );
>
> testSubject.login(token);
>
>
> }
>
> @After
> public void tearDown() throws Exception {
> }
>
> @Test
> public void testHome() throws Exception {
> mvc.perform(MockMvcRequestBuilders.get("/"))
> .andExpect(MockMvcResultMatchers.view().name("home"))
> .andExpect(MockMvcResultMatchers.model().attributeExists("page"))
> .andExpect(MockMvcResultMatchers.model().attributeExists("orders"))
> .andExpect(MockMvcResultMatchers.model().attributeExists("totalPage"))
> .andReturn();
>
>
> }
>
> @Test
> public void testGetHome() {
> //fail("Not yet implemented");
> }
>
> @Test
> public void testArriveHome() {
> //fail("Not yet implemented");
> }
>
>
> @Autowired
> private WebApplicationContext wc;
>
> private MockMvc mvc;
>
> private Subject testSubject;
>
> private MockHttpSession mockSession;
> }
>
>
> when I run this testing code, I found the testing case testHome is failed.
> because the except view is “home”, but in my controller logic, if the
> user’s role is not admin and sales, it will be get view “moms”. so, here’s
> my question: I already use the mock login in setUP:
> UsernamePasswordToken token = new UsernamePasswordToken("admin", "123456”
> );
> testSubject.login(token);
>
> but it is True, I didn’t find anywhere I can make a mock role for this
> subject. just ask is there anyone can give me a little tips for how to
> make a mock Role for a subject?
>
>
>
> @Brian, hi, Brian, would you help me a little tips?
>
>
> Many thanks
>
>
>
> Mike
>
>
>
>
>
>
>
>