def test_4(self):
     invoker = FunctionInvoker()
     invoker.provide_object('4', provide_name="abc")
     invoker.provide_object('5')
     invoker2 = invoker.create_transient()
     invoker2.provide_object('6')
     self.assertEqual(invoker.invoke(func1), '4')
     self.assertEqual(invoker2.invoke(func1), '4') # because match name and type, so return '4'
     invoker3 = invoker.create_transient()
     invoker3.provide_object('7', provide_name="abc")
     self.assertEqual(invoker.invoke(func1), '4')
     self.assertEqual(invoker2.invoke(func1), '4')
     self.assertEqual(invoker3.invoke(func1), '7')