如何在使用Mockito和Junit时自动连接spring bean?

时间:2016-05-05 14:19:13

标签: java spring junit mockito autowired

我正在设置要在Junit中使用的课程。

但是,当我尝试执行以下操作时,我收到错误消息。

当前测试类:

public class PersonServiceTest {

    @Autowired
    @InjectMocks
    PersonService personService;

    @Before
    public void setUp() throws Exception
    {
        MockitoAnnotations.initMocks(this);
        assertThat(PersonService, notNullValue());

    }

    //tests

错误:

org.mockito.exceptions.base.MockitoException: 
Cannot instantiate @InjectMocks field named 'personService'
You haven't provided the instance at field declaration so I tried to construct the instance.
However the constructor or the initialization block threw an exception : null

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

你没有在代码中嘲笑任何东西。 @InjectMocks设置一个将注入模拟的类。

您的代码应如下所示

<?php
    $cnt = 1; // VARIABLE FOR QUESTIONS //
    $query = "SELECT * FROM questions";
    $result = mysqli_query($connection, $query);
    while ($row = mysqli_fetch_object($result))
    {
        $choices = explode ("|", $row->choices);
        if(isset($_POST['submit_post']))
        {              // eq - radio button name (choices) for $cnt - question # //
            $choice = $_POST["eq$cnt"];  // What to do in this $_POST part? //
            $query = "INSERT INTO users(answers)";
            $query .= "VALUES ('{$choice}')";
            $create_post_query = mysqli_query($connection, $query);
        }            
?>

<form action="" method="post">
    <?php 
        if($row->num ==0)
        {  
            $num="&nbsp;&nbsp;"; 
        } else 
        {
            $num=$row->num.".&nbsp; ";
        }   
    ?> 
    <p id="eqIdentify_<?php echo $cnt ?>"><strong><?php echo $num; echo $row->questions; ?></strong> <?php  ?> <?php echo $cnt; ?>
    <?php               
        // VARIABLE FOR CHOICES //
        for($a=0;$a<count($choices);$a++) 
        { 
    ?>
    <br/><label><input type="radio" name="eq<?php echo $cnt;?>" value="<?php echo $choices[$a] ?>" /><?php echo $choices[$a]?></label>
    <?php 
        }
    ?>
<?php 
        $cnt = $cnt + 1;
    } 
?>
    <input type="submit" name="submit_post">
</form>

答案 1 :(得分:1)

另一种解决方案是使用@ContextConfiguration注释和静态内部配置类,如下所示:

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class PersonServiceTest {
    @Autowired
    PersonService personService;

    @Before
    public void setUp() throws Exception {
        when(personService.mockedMethod).thenReturn("something to return");
    }

    @Test
    public void testPerson() {
         assertThat(personService.method, "what you expect");
    }

    @Configuration
    static class ContextConfiguration {
        @Bean
        public PersonService personService() {
            return mock(PersonService.class);
        }
    }
}

无论如何,您需要模拟要测试的方法在内部使用的东西,以获得该方法的所需行为。嘲笑你正在测试的服务是没有意义的。

答案 2 :(得分:1)

你在这里误解了模拟的目的。

当你嘲笑这样一个类时,你假装它已被注入你的应用程序中。这意味着你不想注射它!

解决方案:设置您打算注入的任何bean @Mock,并通过@InjectMocks将它们注入到您的测试类中。

目前还不清楚你要注入的bean在哪里,因为你所拥有的只是定义的服务,但是...

@RunWith(MockitoJUnitRunner.class);
public class PersonServiceTest {

    @Mock
    private ExternalService externalSvc;

    @InjectMocks
    PersonService testObj;
}

答案 3 :(得分:0)

如果我没有弄错......拇指规则就是你不能同时使用它们......你要么使用MockitojunitRunner或SpringJUnitRunner来运行单元测试用例,你就不能同时使用它们。